2013-01-04 36 views
5

嘗試1,香草鏈接庫上編譯和鏈接的Ubuntu VS的OpenSSL OSX

我試圖使用OpenSSL的修補版本(所以DTL上更容易使用)。 OpenSSL是在

/usr/local/openssl-1.0.1c 

的./include/openssl子文件夾中有一噸的頭文件(因爲我認爲它應該):

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 
... 

GCC鏈接到包含文件夾,並給了我一個錯誤 - 它找不到SSL。我使用或多或少的the same thing other people are。這工作,在OSX(10.6),但不是在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. 

嘗試2,符號鏈接庫在/ usr /包括

所以,後來我嘗試創建符號鏈接到的OpenSSL在我的/ usr/include目錄:

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

,並重新嘗試編譯:

~$ 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 

爲什麼第一種方法(即沒有符號鏈接)不起作用?權限?爲什麼第二種方法不起作用?爲什麼在OSX上工作?

回答

9

沒有找到頭文件的問題似乎是你混淆了你的選項。 -L向鏈接程序庫搜索路徑添加路徑,而-I將目錄添加到預處理程序頭文件搜索路徑。更改-L-I來解決這個問題:

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

現在連接問題,是因爲你錯誤地使用-L選項告訴鏈接來尋找包含路徑庫。您需要將該路徑更改爲庫所在的目錄,通常是lib子目錄。此外,連接器要在它們的依賴性相反的順序庫,所以把你想要在命令行上與去年鏈接庫:

$ 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

你的編譯命令出現對OSX工作,但實際上是編譯和與系統提供的鏈接 OpenSSL而不是您想要的版本。它在Ubuntu上完全失敗,因爲您沒有安裝系統OpenSSL的標題和開發庫鏈接。

這是因爲您將搜索路徑選項混淆在一起,而您需要其中的兩個選項。告訴GCC您使用的標題-I。告訴它你在哪裏使用目標代碼庫-L。您需要的編譯命令ON BOTH SYSTEMS就是這樣的:

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