我試圖使用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
我有點難住。如果有人想讓我覺得自己像個傻瓜,我會很高興弄清楚我做錯了什麼!
是的,訂購和放置鏈接時很重要。 '-l'選項應該在編譯器驅動程序(GCC)命令的末尾。圖書館的順序也很重要,因爲'ld'是一個單通的鏈接器。所以'-lssl -lcrypto'起作用,但是'-lcrypto -lssl'不起作用。你會得到連接器錯誤,因爲'ld'在訪問'libssl'時已經訪問過'libcrypto'('libssl'需要'libcrypto'中的東西]。 – jww