2013-09-16 66 views
9

我試圖使用OpenSSL的EVP接口來做一些加密。我很確定我的代碼是正確的,但我似乎無法得到它編譯。我使用的是GCC,Ubuntu 32位精確安裝了libssl-dev並且安裝了最新版本。在GCC中鏈接libssl和libcrypto

該項目目前包含一個文件,program.c

#include <openssl/evp.h> 
... 
i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1() ...); 
... 
EVP_CIPHER_CTX_init(e_ctx); 

等各種呼叫。

這是我如何調用GCC:

gcc -Wall -g -lssl -lcrypto -o program program.c 

然後我得到這樣

/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' 

所以包括輸出清晰的工作:

[email protected]:/usr/include$ find . | grep evp.h 
./openssl/evp.h 

這裏的輸出locate libcrypto。我最好的猜測是,這是一個愚蠢的位置,因此我的鏈接失敗,所以我在-lcrypto之前嘗試-L/usr/lib/i386-linux-gnu,但沒有運氣。

/lib/i386-linux-gnu/libcrypto.so.1.0.0 

我有點難住。如果有人想讓我覺得自己像個傻瓜,我會很高興弄清楚我做錯了什麼!

回答

11

事實證明,這是愚蠢的。在連接器步驟中,我使用的是gcc -Wall -g -lssl -lcrypto -o program program.o。我需要到圖書館鏈接移動到我的連接目標文件後,把libssllibcrypto

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

是的,訂購和放置鏈接時很重要。 '-l'選項應該在編譯器驅動程序(GCC)命令的末尾。圖書館的順序也很重要,因爲'ld'是一個單通的鏈接器。所以'-lssl -lcrypto'起作用,但是'-lcrypto -lssl'不起作用。你會得到連接器錯誤,因爲'ld'在訪問'libssl'時已經訪問過'libcrypto'('libssl'需要'libcrypto'中的東西]。 – jww

-1

嘗試包括使用-I選項報頭,觀察目錄使用-L庫,最後用-l

指定庫名只是讓想在這裏,請根據實際位置來指定路徑。

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

希望它可以幫助。

+0

添加包括似乎不工作(儘管你有路徑正確)。我認爲問題是鏈接到函數定義而不是原型,因爲它似乎通過編譯部分,而不是鏈接。 – Andy