Lorsque je compile openvswitch-1.5.0, j'ai rencontré l'erreur de compilation suivante:
gcc -Wstrict-prototypes -Wall -Wno-sign-compare -Wpointer-arith
-Wdeclaration-after-statement -Wformat-security -Wswitch-enum -Wunused-parameter -Wstrict-aliasing -Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-field-initializers -Wno-override-init -g -O2 -export-dynamic ***-lpthread*** -o utilities/ovs-dpctl utilities/ovs-dpctl.o lib/libopenvswitch.a
/home/jyyoo/src/dpdk/build/lib/librte_eal.a
/home/jyyoo/src/dpdk/build/lib/libethdev.a
/home/jyyoo/src/dpdk/build/lib/librte_cmdline.a
/home/jyyoo/src/dpdk/build/lib/librte_hash.a
/home/jyyoo/src/dpdk/build/lib/librte_lpm.a
/home/jyyoo/src/dpdk/build/lib/librte_mbuf.a
/home/jyyoo/src/dpdk/build/lib/librte_ring.a
/home/jyyoo/src/dpdk/build/lib/librte_mempool.a
/home/jyyoo/src/dpdk/build/lib/librte_malloc.a -lrt -lm
/usr/bin/ld: /home/jyyoo/src/dpdk/build/lib/librte_eal.a(eal.o): undefined reference
to symbol 'pthread_create@@GLIBC_2.2.5'
/lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from
command line
Si j'essaie de voir les symboles de libpthread
, ça a l'air bien.
$ readelf -s /lib/x86_64-linux-gnu/libpthread.so.0 | grep pthread_create
199: 0000000000008220 2814 FUNC GLOBAL DEFAULT 13 pthread_create@@GLIBC_2.2.5
173: 0000000000008220 2814 FUNC LOCAL DEFAULT 13 __pthread_create_2_1
462: 0000000000008220 2814 FUNC GLOBAL DEFAULT 13 pthread_create@@GLIBC_2.2
Pourriez-vous donner des conseils ou des conseils?
gcc
pas faitg++
Réponses:
Vous devez mentionner la bibliothèque sur la ligne de commande après la compilation des fichiers objets:
Explication: la liaison dépend de l'ordre des modules. Les symboles sont d'abord demandés, puis liés à partir d'une bibliothèque qui les possède. Vous devez donc spécifier les modules qui utilisent les bibliothèques en premier, et les bibliothèques après eux. Comme ça:
De plus, en cas de dépendance circulaire, vous devez spécifier plusieurs fois la même bibliothèque sur la ligne de commande. Donc, dans le cas où a
libb
besoin d'un symbolelibc
et d'unlibc
symbolelibb
, la ligne de commande doit être:la source
-Wl,--start-group -la -lb- -lc -Wl,--end-group
pour les dépendances circulaires.Le message d'erreur dépend de la version de distribution / compilateur:
Ubuntu Saucy:
Ubuntu Raring: (plus informatif)
Solution: il se peut que vous manquiez une bibliothèque dans vos étapes de compilation, pendant l'étape de liaison. Dans mon cas, j'ai ajouté «-lz» aux drapeaux makefile / GCC.
Contexte: DSO est un objet partagé dynamique ou une bibliothèque partagée.
la source
glewInit
, you need-lGLEW
Contexte
Le
DSO missing from command line
message s'affiche lorsque l'éditeur de liens ne trouve pas le symbole requis avec sa recherche normale mais que le symbole est disponible dans l'une des dépendances d'une bibliothèque dynamique directement spécifiée.Dans le passé, l'éditeur de liens considérait que les symboles dans les dépendances des langues spécifiées étaient disponibles. Mais cela a changé dans une version ultérieure et maintenant l'éditeur de liens impose une vue plus stricte de ce qui est disponible. Le message vise donc à faciliter cette transition.
Que faire?
Si vous êtes le responsable du logiciel
Vous devez résoudre ce problème en vous assurant que toutes les bibliothèques nécessaires pour satisfaire les symboles nécessaires sont directement spécifiées sur la ligne de commande de l'éditeur de liens. Gardez également à l'esprit que l'ordre compte souvent.
Si vous essayez simplement de compiler le logiciel
Comme solution de contournement, il est possible de revenir à la vue plus permissive des symboles disponibles en utilisant l'option
-Wl,--copy-dt-needed-entries
.Les moyens courants d'injecter cela dans une build sont d'exporter LDFLAGS avant de lancer
configure
ou similaire comme ceci:Parfois, passer
LDFLAGS="-Wl,--copy-dt-needed-entries"
directement àmake
pourrait également fonctionner.la source
-Wl,
bit, soit vous avez un éditeur de liens qui ne prend pas en charge ces options. Quel éditeur de liens utilisez-vous? Cette réponse suppose que l'éditeur de liens binutils classique (ld.bfd). Le lieur d'or binutils (ld.gold) indique--copy-dt-needed-entries
que "Non pris en charge". Donc, si vous avez cela (ou tout autre éditeur de liens qui ne prend pas en charge cette option) par défaut, vous devrez peut-être suivre la section pour les responsables ou passer au ld classique pour la liaison. Je pense que vous pouvez l'utiliser-fuse-ld=ld.bfd
pour cela.J'ai trouvé un autre cas et donc je pense que vous vous trompez tous.
Voici ce que j'avais:
Le problème est que la ligne de commande ne contenait PAS
-lX11
- bien que le libX11.so doive être ajouté en tant que dépendance car il y avait aussi des bibliothèques GTK et GNOME dans les arguments.Donc, la seule explication pour moi est que ce message était peut-être destiné à vous aider , mais il ne l'a pas fait correctement. C'était probablement simple: la bibliothèque qui fournit le symbole n'a pas été ajoutée à la ligne de commande.
Veuillez noter trois règles importantes concernant la liaison dans POSIX:
-l<name>
, vous ne savez jamais si elle prendralib<name>.so
oulib<name>.a
. La bibliothèque dynamique est préférée, si elle est trouvée, et seules les bibliothèques statiques peuvent être appliquées par l'option du compilateur - c'est tout. Et si vous avez des problèmes comme ci-dessus, cela dépend si vous aviez des bibliothèques statiques ou dynamiquesla source
J'ai trouvé que j'avais la même erreur. Je compilais un code avec lapack et blas. Lorsque j'ai changé l'ordre d'appellation des deux bibliothèques, l'erreur a disparu.
"LAPACK_LIB = -llapack -lblas" a fonctionné là où "LAPACK_LIB = -lblas -llapack" a donné l'erreur décrite ci-dessus.
la source
find_package(Threads)
ettarget_link_libraries( ... ${CMAKE_THREAD_LIBS_INIT})
J'ai également rencontré le même problème. Je ne sais pas pourquoi, j'ajoute juste une
-lpthread
option au compilateur et tout va bien.Vieux:
obtenu l'erreur suivante. Si j'ajoute l'
-lpthread
option à la commande ci-dessus, alors OK.la source
Ce que j'ai trouvé, c'est que parfois la bibliothèque dont l'éditeur de liens se plaint n'est pas celle qui cause le problème. Il existe peut-être un moyen intelligent de déterminer où se situe le problème, mais voici ce que je fais:
@peter karasev: J'ai rencontré le même problème avec un projet gcc 4.8.2 cmake sur CentOS7. L'ordre des bibliothèques dans la section "target_link_libraries" est important. Je suppose que cmake transmet simplement la liste à l'éditeur de liens tel quel, c'est-à-dire qu'il n'essaie pas de trouver le bon ordre. C'est raisonnable - quand vous y pensez, cmake ne peut pas savoir quel est l'ordre correct jusqu'à ce que la liaison soit terminée avec succès.
la source
Veuillez ajouter:
CFLAGS="-lrt"
etLDFLAGS="-lrt"
la source
Le même problème m'est arrivé lorsque j'utilise
distcc
pour créer mon projet c ++; Enfin, je l'ai résolu avecexport CXX="distcc g++"
.la source
si vous utilisez cmake et pthreads utilisés, essayez d'ajouter les lignes suivantes
la source
La même chose m'est arrivée lors de l'installation du test HPCC (inclut HPL et quelques autres tests). J'ai ajouté
-lm
aux drapeaux du compilateur dans mon script de construction, puis il a été compilé avec succès.la source
Si vous utilisez
g++
, assurez-vous que vous ne courez pas à lagcc
placela source
Essayez d'ajouter
-pthread
à la fin de la liste de bibliothèques dans le Makefile .Ça a marché pour moi.
la source
Si vous utilisez CMake, vous pouvez le résoudre de plusieurs manières:
Solution 1: la plus élégante
Solution 2: utiliser CMake
find_package
Solution 3: modifier les indicateurs CMake
la source