2013-09-16 35 views
9

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!

Trả lời

11

Hóa ra đó là điều ngu ngốc. Trong bước liên kết, tôi đã sử dụng gcc -Wall -g -lssl -lcrypto -o program program.o. Tôi cần thiết để di chuyển các liên kết thư viện để sau khi tập tin đối tượng tôi đã liên kết, và đặt libssl trước libcrypto:

gcc -Wall -g -o program program.o -lssl -lcrypto 
+3

Đú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

-1

Cố gắng bao gồm tiêu đề dùng -I tùy chọn, Nhìn vào thư mục cho thư viện sử dụng -L và cuối cùng chỉ định tên thư viện với -l

Chỉ cần làm đoán ở đây, xin ghi rõ con đường dựa trên vị trí thực tế.

gcc -g -Wall -L/usr/lib -I/usr/include -lssl -lcrypto -o program program.c 

Hy vọng điều đó có thể hữu ích.

+0

Thêm bao gồm dường như không làm việc (mặc dù bạn đã đúng đường dẫn). Tôi nghĩ rằng vấn đề là liên kết với các định nghĩa chức năng chứ không phải là nguyên mẫu, vì nó dường như làm cho nó thông qua một phần biên dịch, chỉ cần không phải là liên kết. – Andy

Các vấn đề liên quan