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!
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