2013-09-16 17 views
9

Ich versuche, OpenSSL EVP-Schnittstelle zu verwenden, um einige Verschlüsselung zu tun. Ich bin mir ziemlich sicher, dass mein Code richtig ist, aber ich kann es nicht zum Kompilieren bringen. Ich benutze GCC, und Ubuntu 32-Bit präzise mit libssl-dev installiert und in der neuesten Version. Das Projekt besteht zur Zeit aus einer Datei, program.c.Verknüpfen von libssl und libcrypto in GCC

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

unter anderen verschiedenen Anrufe.

Hier ist, wie ich gcc aufrufen:

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

Dann bekomme ich eine Ausgabe wie diese

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

Also das sind eindeutig arbeiten:

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

Hier ist die Ausgabe von locate libcrypto. Meine beste Vermutung ist, dass dies ein dummer Ort dafür ist und deshalb mein Link versagt, also versuchte ich -L/usr/lib/i386-linux-gnu vor -lcrypto ohne Glück auch.

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

Ich bin irgendwie ratlos. Wenn jemand mich dazu bringen will, mich wie ein Idiot zu fühlen, wäre ich sehr aufgeregt, herauszufinden, was ich falsch mache!

Antwort

11

Es stellt sich heraus, es war etwas dummes. Im Linker-Schritt verwendete ich gcc -Wall -g -lssl -lcrypto -o program program.o. Ich brauchte die Bibliothek Links nach der Objektdatei zu bewegen, ich war die Verknüpfung und setzen libssl vor libcrypto:

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

Ja, Reihenfolge und Platzierung wichtig beim Verknüpfen. Die '-l'-Optionen sollten am Ende des Compiler-Treibers (GCC) stehen. Und die Reihenfolge der Bibliotheken ist auch wichtig, weil "ld" ein Single-Pass-Linker ist. So funktioniert '-lssl -lcrypto', aber' -lcrypto-lssl' funktioniert nicht. Sie werden Linker-Fehler bekommen, weil 'ld'' libcrypto' bereits besucht hat, wenn es 'libssl' besucht (' libssl' benötigt Sachen von 'libcrypto'). – jww

-1

Try einschließlich Header -I-Option, für Bibliothek suchen in das Verzeichnis -L verwenden und schließlich den Namen der Bibliothek mit -l

einfach machen hier erraten Angabe bitte Pfad auf den tatsächlichen Speicherort angeben, basiert.

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

Ich hoffe, es kann helfen.

+0

Hinzufügen der gehören scheint nicht zu funktionieren (obwohl Sie der Weg richtig war). Ich denke, das Problem besteht eher darin, sich mit den Funktionsdefinitionen als mit den Prototypen zu verbinden, da es scheinbar den Kompilierungsteil durchläuft, nur nicht die Verknüpfung. – Andy