Próbuję użyć interfejsu EVP OpenSSL do szyfrowania. Jestem prawie pewien, że mój kod jest odpowiedni, ale nie mogę go zmusić do skompilowania. Używam GCC i 32-bitowego systemu operacyjnego Ubuntu z zainstalowanym libssl-dev i najnowszą wersją.Łączenie libssl i libcrypto w GCC
Projekt składa się obecnie z jednego pliku, program.c
.
#include <openssl/evp.h>
...
i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1() ...);
...
EVP_CIPHER_CTX_init(e_ctx);
między innymi różnymi połączeniami.
Oto jak wywołać gcc:
gcc -Wall -g -lssl -lcrypto -o program program.c
następnie uzyskać moc jak ten
/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'
So include jest wyraźnie pracy:
[email protected]:/usr/include$ find . | grep evp.h
./openssl/evp.h
Oto wyjściowy locate libcrypto
. Domyślam się, że jest to głupie miejsce i dlatego mój link kończy się niepowodzeniem, więc próbowałem -L/usr/lib/i386-linux-gnu
przed -lcrypto
również bez powodzenia.
/lib/i386-linux-gnu/libcrypto.so.1.0.0
Jestem trochę zakłopotany. Jeśli ktokolwiek chce sprawić, żebym poczuł się jak głupiec, byłbym bardzo podekscytowany, aby dowiedzieć się, co robię źle!
Tak, zamówienie i umieszczenie mają znaczenie podczas łączenia. Opcje '-l' powinny pojawić się na końcu polecenia sterownika kompilatora (GCC). Kolejność bibliotek ma również znaczenie, ponieważ 'ld' to łącznik z pojedynczym przejściem. Więc '-lssl -lcrypto' działa, ale' -lcrypto -lssl' nie zadziała. Dostaniesz błędy linkera, ponieważ 'ld' już odwiedziło' libcrypto' podczas odwiedzania 'libssl' (' libssl' potrzebuje rzeczy z 'libcrypto'). – jww