2013-01-04 38 views
5

Cố gắng 1, Vanilla Liên kết Thư việnBiên soạn và liên kết OpenSSL trên Ubuntu vs OSX

Tôi đang cố gắng sử dụng một phiên bản vá của OpenSSL (vì vậy DTLS là dễ dàng hơn để sử dụng). OpenSSL là trong

/usr/local/openssl-1.0.1c 

Các thư mục con ./include/openssl có một tấn các tập tin tiêu đề (như tôi cho rằng nó nên):

lrwxrwxrwx 1 root root 22 Dec 25 05:49 aes.h -> ../../crypto/aes/aes.h 
lrwxrwxrwx 1 root root 24 Dec 25 05:49 asn1.h -> ../../crypto/asn1/asn1.h 
lrwxrwxrwx 1 root root 28 Dec 25 05:49 asn1_mac.h -> ../../crypto/asn1/asn1_mac.h 
... 

liên kết GCC vào thư mục bao gồm và mang lại cho tôi một sai sót nó không thể tìm thấy SSL. Tôi đang sử dụng nhiều hơn hoặc ít hơn the same thing other people are. Công trình này, trên OSX (10.6), nhưng không phải trên Ubuntu:

~$ gcc -L/usr/local/openssl-1.0.1c/include -lssl -lcrypto -o server server.c 
server.c:20:25: fatal error: openssl/ssl.h: No such file or directory 
compilation terminated. 

Cố gắng 2, Symbolic Link vào Thư viện trong/usr/include

Vì vậy, sau đó tôi cố gắng tạo ra một liên kết tượng trưng đến OpenSSL trong tôi/usr/include:

sudo ln -s /usr/local/openssl-1.0.1c/include/openssl /usr/include/openssl 

và tái cố gắng biên soạn:

~$ gcc -L/usr/local/openssl-1.0.1c/include -lssl -lcrypto -o server server.c 
/usr/bin/ld: cannot find -lssl 
/usr/bin/ld: cannot find -lcrypto 
collect2: ld returned 1 exit status 
make: *** [server] Error 1 

Tại sao phương pháp đầu tiên (tức là không có liên kết tượng trưng) không hoạt động? Quyền? Tại sao phương pháp thứ hai không hoạt động? Tại sao tính năng này hoạt động trên OSX ???

Trả lời

9

Sự cố với tệp tiêu đề không được tìm thấy có vẻ như bạn đang trộn các tùy chọn của mình. -L thêm đường dẫn đến đường dẫn tìm kiếm thư viện trình liên kết, trong khi -I thêm thư mục vào đường dẫn tìm kiếm tệp tiêu đề tiền xử lý. Thay đổi -L--I để giải quyết vấn đề đó:

$ gcc -I/usr/local/openssl-1.0.1c/include server.c -o server.o 

Bây giờ vấn đề mối liên kết là bởi vì bạn sai lầm sử dụng tùy chọn -L nói với các mối liên kết để tìm kiếm các thư viện trong đường dẫn bao gồm. Bạn cần thay đổi đường dẫn đó đến thư mục chứa thư viện, thường là thư mục con lib. Ngoài ra, các mối liên kết muốn thư viện theo thứ tự ngược phụ thuộc của họ, vì vậy đặt các thư viện bạn muốn liên kết với cuối cùng trên dòng lệnh:

$ gcc -I/usr/local/openssl-1.0.1c/include server.c -o server.o \ 
    -L/usr/local/openssl-1.0.1c/lib -lssl -lcrypto 
3

lệnh biên soạn của bạn xuất hiện để làm việc trên OSX nhưng thực sự là biên soạn và liên kết với hệ thống được cung cấp OpenSSL thay vì phiên bản bạn muốn. Nó không hoàn toàn trên Ubuntu vì bạn không có các tiêu đề và liên kết thư viện phát triển cho hệ thống OpenSSL được cài đặt.

Điều này là do bạn có các tùy chọn đường dẫn tìm kiếm được trộn lẫn và bạn cần hai trong số chúng. Để cho GCC biết bạn đang sử dụng tiêu đề -I. Để cho nó biết nơi mà các thư viện mã đối tượng bạn đang sử dụng -L. Lệnh biên dịch bạn cần, ON BOTH SYSTEMS, giống như sau:

$ gcc -I /usr/local/openssl-1.0.1c/include -L /usr/local/openssl-1.0.1c/lib \ 
     -o server server.c -lssl -lcrypto 
Các vấn đề liên quan