2013-09-16 12 views
9

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!

Odpowiedz

11

Okazuje się, że to było coś głupiego. W etapie łączenia użyłem gcc -Wall -g -lssl -lcrypto -o program program.o. Musiałem przenieść linki do biblioteki po pliku obiektu byłem łącząc i umieścić libssl przed libcrypto:

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

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

-1

Spróbuj tym nagłówków z wykorzystaniem opcji -I, Spójrz w katalogu do biblioteki przy użyciu -L i wreszcie podając nazwę biblioteki z -l

Wystarczy odgadnąć co tu, proszę podać ścieżkę na podstawie aktualnej lokalizacji.

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

Mam nadzieję, że to może pomóc.

+0

Dodawanie to nie wydają się działać (choć trzeba było ścieżka poprawne). Myślę, że problem polega raczej na definicji funkcji niż na prototypach, ponieważ wydaje się, że przechodzą one przez część kompilacji, a nie przez linkowanie. – Andy