2013-09-16 2 views
9

J'essaye d'utiliser l'interface EVP d'OpenSSL pour faire du chiffrement. Je suis assez sûr que mon code est correct, mais je n'arrive pas à le compiler. J'utilise GCC, et Ubuntu 32 bits précis avec libssl-dev installé et à la dernière version.Liaison libssl et libcrypto dans GCC

Le projet consiste actuellement en un fichier, program.c.

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

entre autres appels divers.

Voici comment j'invoque gcc:

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

Puis-je obtenir une sortie comme ce

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

Ainsi include travaille clairement:

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

est ici la sortie locate libcrypto. Ma meilleure supposition est que c'est un endroit stupide pour cela et c'est pourquoi mon lien échoue, donc j'ai essayé -L/usr/lib/i386-linux-gnu avant -lcrypto sans aucune chance aussi.

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

Je suis un peu perplexe. Si quelqu'un veut me faire sentir comme un imbécile, je serais très excité de comprendre ce que je fais mal!

Répondre

11

Il s'avère que c'était quelque chose de stupide. Dans l'étape de l'éditeur de liens, j'utilisais gcc -Wall -g -lssl -lcrypto -o program program.o. Je avais besoin de déplacer les liens de la bibliothèque pour une fois le fichier objet que je liaison, et de mettre libssl avant libcrypto:

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

Oui, l'ordre et le placement sont importants lors de la liaison. Les options '-l' devraient venir à la fin de la commande du pilote du compilateur (GCC). Et l'ordre des bibliothèques est également important car 'ld' est un éditeur de liens unique. Donc '-lssl -lcrypto' fonctionne, mais' -lcrypto -lssl' ne fonctionnera pas. Vous obtiendrez des erreurs d'éditeur de liens car 'ld' est déjà visité' libcrypto' quand il consulte 'libssl' (' libssl' a besoin de '' libcrypto' '). – jww

-1

Essayez d'inclure les en-têtes à l'aide de l'option -I, Recherchez dans le répertoire pour la bibliothèque à l'aide -L et, enfin, en spécifiant le nom de la bibliothèque avec -l

Juste faire deviner ici, s'il vous plaît spécifier le chemin en fonction de l'emplacement réel.

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

Espérons que cela puisse aider.

+0

Ajout include ne semble pas fonctionner (si vous aviez le bon chemin). Je pense que le problème est lié aux définitions de fonctions plutôt qu'aux prototypes, car il semble passer par la partie compilation, mais pas par la liaison. – Andy