Tôi đang cố gắng sử dụng giao diện EVP của OpenSSL để thực hiện một số mã hóa. Tôi khá chắc chắn mã của tôi là đúng, nhưng tôi không thể có vẻ để có được nó để biên dịch. Tôi đang sử dụng GCC và Ubuntu 32 bit chính xác với cài đặt libssl-dev và phiên bản mới nhất.Liên kết libssl và libcrypto trong GCC
Dự án hiện bao gồm một tệp, program.c
.
#include <openssl/evp.h>
...
i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1() ...);
...
EVP_CIPHER_CTX_init(e_ctx);
trong số các cuộc gọi khác nhau.
Dưới đây là cách tôi gọi gcc:
gcc -Wall -g -lssl -lcrypto -o program program.c
Sau đó, tôi nhận được kết quả như thế này
/home/andy/program/program.c:31: undefined reference to `EVP_sha1'
/home/andy/program/program.c:31: undefined reference to `EVP_aes_256_cbc'
/home/andy/program/program.c:31: undefined reference to `EVP_BytesToKey'
/home/andy/program/program.c:44: undefined reference to `EVP_CIPHER_CTX_init'
Vì vậy, bao gồm đang làm việc rõ ràng:
[email protected]:/usr/include$ find . | grep evp.h
./openssl/evp.h
Dưới đây là sản phẩm của locate libcrypto
. Đoán của tôi tốt nhất là đây là một vị trí ngu ngốc cho nó và là lý do tại sao liên kết của tôi là không, vì vậy tôi đã thử -L/usr/lib/i386-linux-gnu
trước -lcrypto
mà không có may mắn là tốt.
/lib/i386-linux-gnu/libcrypto.so.1.0.0
Tôi sắp xếp bối cảnh. Nếu bất cứ ai muốn làm cho tôi cảm thấy như một kẻ ngốc, tôi sẽ rất vui mừng để tìm ra những gì tôi đang làm sai!
Đúng, trật tự và vị trí quan trọng khi liên kết. Các tùy chọn '-l' sẽ xuất hiện ở cuối trình điều khiển trình biên dịch (GCC). Và thứ tự của các thư viện cũng quan trọng bởi vì 'ld' là một trình liên kết đơn. Vì vậy, '-lssl -lcrypto' hoạt động, nhưng' -lcrypto -lssl' sẽ không hoạt động. Bạn sẽ gặp lỗi liên kết vì 'ld' đã truy cập' libcrypto' khi nó truy cập 'libssl' (' libssl' cần nội dung từ 'libcrypto'). – jww