web-dev-qa-db-fra.com

Erreur de l'éditeur de liens sous Linux: "référence non définie à"

Je suis capable de faire une bibliothèque partagée sans problèmes. Je crée libcbitcoin.so (sans erreur) et tente de créer un lien avec un exécutable ainsi que des bibliothèques OpenSSL. J'utilise cette commande:

gcc -L/media/sf_BitEagle_Projects/cbitcoin/build/bin -lcbitcoin \
-Wl-rpath,/media/sf_BitEagle_Projects/cbitcoin/build/bin -lssl -lcrypto \
-L/usr/local/ssl/lib/ -o /media/sf_BitEagle_Projects/cbitcoin/build/bin/testCBAddress \
/media/sf_BitEagle_Projects/cbitcoin/build/obj/testCBAddress.o \
/media/sf_BitEagle_Projects/cbitcoin/build/obj/CBOpenSSLCrypto.o

Le répertoire bin est l'emplacement de la bibliothèque. Le répertoire obj contient les fichiers objets que je souhaite associer à un exécutable. Dans la commande, j'utilise les options -L, -l et -rpath, ce qui, à mon avis, était tout ce qui était nécessaire pour relier Linux. Il semble que je me trompe depuis que je reçois des erreurs comme:

/media/sf_BitEagle_Projects/cbitcoin/test/testCBAddress.c:40:
undefined reference to `CBNewByteArrayFromString'

CBNewByteArrayFromString se trouve dans la bibliothèque. Pour une raison quelconque, il n'est pas lié. OpenSSL aussi:

/media/sf_BitEagle_Projects/cbitcoin/dependencies/crypto/CBOpenSSLCrypto.c:37:
undefined reference to `SHA1'

Comment puis-je obtenir le lien au travail?

Version GCC: gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

Sur Linux Mint 13

Je vous remercie.

11
Matthew Mitchell

Placez les bibliothèques après les fichiers d’objets sur la ligne de commande du lien:

gcc /media/sf_BitEagle_Projects/cbitcoin/build/obj/testCBAddress.o \
    /media/sf_BitEagle_Projects/cbitcoin/build/obj/CBOpenSSLCrypto.o \
    -L/media/sf_BitEagle_Projects/cbitcoin/build/bin \
    -lcbitcoin -Wl-rpath,/media/sf_BitEagle_Projects/cbitcoin/build/bin \
    -L/usr/local/ssl/lib/ -lssl -lcrypto \
    -o /media/sf_BitEagle_Projects/cbitcoin/build/bin/testCBAddress

Si vous ne le faites pas, l’éditeur de liens peut décider qu’il n’a besoin de rien d’une bibliothèque particulière au stade du lien où il analyse la bibliothèque, puis il ne réanalysera pas la bibliothèque plus tard après avoir trouvé des symboles non définis dans le fichier. fichiers d'objet. Si vous mettez les fichiers objet en premier, vous ne rencontrez pas ce problème.

27
Jonathan Leffler

Je pense que cela est dû au fait que le symbole ne peut PAS être trouvé, gcc passera d'abord par la gauche, essayez de mettre le fichier lib à la fin.

1
How Chen