web-dev-qa-db-fra.com

Erreur de bibliothèque libcrypto introuvable

Lorsque j'essaie de compiler un code C qui utilise les fonctions de la bibliothèque openssl 'crypto' avec la ligne de commande -lcrypto avec gcc 4.4.3 cela donne une erreur

`@ubu:$ gcc -ggdb aes_m.c -Werror -Wall -I /usr/local/ssl/include/ -lcrypto -o aes
 /usr/bin/ld: cannot find -lcrypto
 collect2: ld returned 1 exit status`

quelle peut en être la raison??

J'ai déjà parcouru cette discussion ld ne peut pas trouver une bibliothèque existante mais cela n'aide pas.

localiser les résultats de la commande dans

$ locate libcrypto
/home/abhi/Downloads/openssl-1.0.1b/libcrypto.a
/home/abhi/Downloads/openssl-1.0.1b/libcrypto.pc
/lib/libcrypto.so.0.9.8
/lib/i486/libcrypto.so.0.9.8
/lib/i586/libcrypto.so.0.9.8
/lib/i686/cmov/libcrypto.so.0.9.8
/usr/lib/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/local/ssl/lib/libcrypto.a
/usr/local/ssl/lib/pkgconfig/libcrypto.pc

Quelqu'un peut-il m'aider à ce sujet ou signaler toute erreur que je fais

@ Daniel Roethlisberger a essayé d'utiliser l'indicateur -L mais cela a entraîné ces erreurs

gcc -ggdb aes_m.c -Werror -Wall -I /usr/local/ssl/include/ -L /usr/local/ssl/lib -lcrypto -o aes
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup':
dso_dlfcn.c:(.text+0x2d): undefined reference to `dlopen'
dso_dlfcn.c:(.text+0x43): undefined reference to `dlsym'
dso_dlfcn.c:(.text+0x4d): undefined reference to `dlclose'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_pathbyaddr':
dso_dlfcn.c:(.text+0x8f): undefined reference to `dladdr'
dso_dlfcn.c:(.text+0xe9): undefined reference to `dlerror'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_func':
dso_dlfcn.c:(.text+0x4b1): undefined reference to `dlsym'
dso_dlfcn.c:(.text+0x590): undefined reference to `dlerror'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_var':
dso_dlfcn.c:(.text+0x611): undefined reference to `dlsym'
dso_dlfcn.c:(.text+0x6f0): undefined reference to `dlerror'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_unload':
dso_dlfcn.c:(.text+0x755): undefined reference to `dlclose'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_load':
dso_dlfcn.c:(.text+0x837): undefined reference to `dlopen'
dso_dlfcn.c:(.text+0x8ae): undefined reference to `dlclose'
dso_dlfcn.c:(.text+0x8f5): undefined reference to `dlerror'
collect2: ld returned 1 exit status

Merci beaucoup

24
abhi

Ajoutez -L /usr/local/ssl/lib/ Dans la ligne de commande GCC, avant le -lcrypto. Étant donné que vous construisez par rapport aux en-têtes OpenSSL sous /usr/local/ssl, Vous devez également établir un lien avec la bibliothèque réelle sous le même préfixe (même si vous ne semblez en avoir installé qu'une statique, cela peut ou non être votre intention; vous devrez peut-être réinstaller correctement votre OpenSSL construit à partir de la source).

(modifier) ​​Pour corriger la dlopen() et les amis qui ne sont pas trouvés par l'éditeur de liens, ajoutez -ldl dans la ligne de commande GCC. -ldl Indique à l'éditeur de liens de se lier également à libdl.so, qui est la bibliothèque partagée contenant dlopen(), dlsym(), dlclose() etc; ces fonctions sont utilisées par OpenSSL en interne et donc, -ldl est une dépendance indirecte lors de l'utilisation de -lcrypto (sous Linux). Étant donné que vous établissez une liaison avec une version statique de libcrypto, vous devez établir une liaison explicite avec toutes les dépendances indirectes.

Si vous n'êtes pas familier avec les liens vers les bibliothèques appropriées, je vous suggère d'utiliser OpenSSL tel qu'il est installé à partir du gestionnaire de packages de votre système d'exploitation; cela pourrait vous éviter des ennuis.

33

Cela pourrait être pertinent pour les personnes qui ont essayé de créer leur propre openssl à partir des sources, puis de l'utiliser pour compiler d'autres programmes (dans mon cas, Git)

Lors de la configuration d'OpenSL, ajoutez une option "partagée" telle que: ./config shared

Cela créera la bibliothèque statique requise libcrypto.so Vous en trouverez plus dans le fichier INSTALL;)

De plus, si vous rencontrez cette erreur pendant "make" ".... ne peut pas être utilisé lors de la création d'un objet partagé; recompilez avec -fPIC"

Ajoutez simplement -fPIC dans ./config, par ex.

./config shared -fPIC

Bien que j'aimerais que quelqu'un me dise ce qu'il fait réellement et que je ne gâche pas quelque chose. :)

10
Daniel Hollas