Ne pouvez pas lier OpenSSL code
Je suis en train de construire une openssl programme simple. Voici le code complet:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "openssl/aes.h"
int main(int argc, char* argv[])
{
AES_KEY aesKey_;
unsigned char userKey_[16];
unsigned char in_[16];
unsigned char out_[16];
strcpy(userKey_,"0123456789123456");
strcpy(in_,"0123456789123456");
fprintf(stdout,"Original message: %s", in_);
AES_set_encrypt_key(userKey_, 128, &aesKey_);
AES_encrypt(in_, out_, &aesKey_);
AES_set_decrypt_key(userKey_, 128, &aesKey_);
AES_decrypt(out_, in_,&aesKey_);
fprintf(stdout,"Recovered Original message: %s", in_);
return 0;
}
J'essaie de le compiler à l'aide de cette commande:
gcc -I/home/aleksei/openSSL0.9.8/include -o app -L . -lssl -lcrypto tema1.c
et j'obtiens ceci:
/tmp/ccT1XMid.o: In function `main':
tema1.c:(.text+0x8d): undefined reference to `AES_set_encrypt_key'
tema1.c:(.text+0xa7): undefined reference to `AES_encrypt'
tema1.c:(.text+0xbf): undefined reference to `AES_set_decrypt_key'
tema1.c:(.text+0xd9): undefined reference to `AES_decrypt'
collect2: ld returned 1 exit status
Je suis sous Ubuntu 10.04. Comment puis-je obtenir que cela fonctionne ?
L'erreur est vous dire que le linker ne peut trouver la définition de ces fonctions. Même si vous la liste des bibliothèques, vous spécifiez l'actuelle bibliothèque pour la bibliothèque des chemins, ce qui pourrait être le problème. Avez-vous des
Oui je les ai dans le répertoire courant.
Même avec cette commande gcc -I/home/aleksei/openSSL0.9.8/include -o app-L /home/aleksei/openSSL0.9.8/lib/ -lssl -lcrypto tema1.c il me donne toujours le même résultat. Comment puis-je faire de l'éditeur de liens trouver les définitions de ces fonctions?
Si j'écris un endroit qui n'existe pas à regarder pour les libs, il me donne ceci: /usr/bin/ld: ne peut trouver -lssl . Donc, cela signifie que l'éditeur de liens les trouve, mais quoi?
Dump les symboles dans la bibliothèque.
libssl.so
et libcrypto.so
dans le répertoire courant?Oui je les ai dans le répertoire courant.
Même avec cette commande gcc -I/home/aleksei/openSSL0.9.8/include -o app-L /home/aleksei/openSSL0.9.8/lib/ -lssl -lcrypto tema1.c il me donne toujours le même résultat. Comment puis-je faire de l'éditeur de liens trouver les définitions de ces fonctions?
Si j'écris un endroit qui n'existe pas à regarder pour les libs, il me donne ceci: /usr/bin/ld: ne peut trouver -lssl . Donc, cela signifie que l'éditeur de liens les trouve, mais quoi?
Dump les symboles dans la bibliothèque.
nm libcrypto.so | grep AES_
. Effectuez l'une des symboles manquants venir? Si non (ou leur lettre U au lieu de T), alors les symboles ne sont pas vraiment dans le libcrypto de la bibliothèque. Ils sont dans ma copie de 0.9.8 r que j'ai compilé avec la config par défaut, mais je présume que c'est une OpenSSL que vous avez construit vous-même, oui?OriginalL'auteur AlexandruC | 2012-06-12
Vous devez vous connecter pour publier un commentaire.
Vous pouvez peut-être essayer de lier statiquement, mais le
-L
option et-lcrypto
êtes à la recherche d'un fichier à lien avec de façon dynamique. Lien statique à une bibliothèque en particulier, il suffit de spécifier votre.a
de fichier sur la ligne de commande du compilateur, après tous vos fichiers source.E. g.,
OriginalL'auteur indiv
Pour ceux d'entre vous qui ont ce même problème mais à l'aide de Windows, Mingw et ce OpenSSL pour Windows (en ce moment: Win32 OpenSSL v1.0.2). Vous devez le lier à
libeay32.a
qui est situé dansC:\OpenSSL-Win32\lib\MinGW\
(après l'installation de OpenSSL).Dans mon cas, je suis en utilisant CMake et la puissant CLion IDE, donc j'ai dû renommer la bibliothèque de
libeay32.dll.a
parce que CMake n'était pas à trouver la bibliothèque. C'est mon CMakeLists.txt:J'ai fait le test avec cet exemple (qui est emprunté à cette réponse):
OriginalL'auteur lmiguelmh