libpthread.so.0: Fehler beim hinzufügen von Symbolen: DSO fehlt von der Kommandozeile aus
Wenn ich kompiliere openvswitch-1.5.0, ich habe festgestellt das folgende Kompilierungsfehler:
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
Wenn ich versuche zu sehen, die Symbole der libpthread
es sieht gut aus.
$ 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
Können Sie uns irgendwelche Tipps oder Hinweise?
- Siehe auch Merkwürdig-linking-Fehler: DSO fehlt von der Befehl-Linie, DSO fehlt von der Befehl-Linie und Linking Fehler: DSO fehlt von der Befehl-Linie.
- link_libraries(pthread)
- # readelf -s /lib/x86_64-linux-gnu/libncurses.so readelf: Fehler: Konnte nicht gefunden werden '/lib/x86_64-linux-gnu/libncurses.so'. System error message: Zu viele Ebenen aus symbolischen links
- Mögliche Duplikate von DSO fehlt von der Befehl-Linie
- Goddamnit, ich habe
gcc
nichtg++
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie erwähnen, die Bibliothek auf der Kommandozeile nach die object-Dateien kompiliert werden:
Erläuterung: die Anbindung ist abhängig von der Reihenfolge der Module. Symbole werden zuerst angefordert werden, und werden dann mit in von eine Bibliothek, die hat Sie. So müssen Sie angeben, Module, Bibliotheken erste und Bibliotheken nach Ihnen. Wie diese:
Darüber hinaus in Fall gibt es eine zirkuläre Abhängigkeit, sollten Sie die gleiche Bibliothek auf der Kommandozeile mehrere Male. So im Fall
libb
Bedürfnisse symbol auslibc
undlibc
Bedürfnisse symbol auslibb
, die Kommandozeile sollte sein:-Wl,--start-group -la -lb- -lc -Wl,--end-group
für zirkuläre Abhängigkeiten.Die Fehlermeldung hängt von der Verteilung /compiler-version:
Ubuntu Saucy:
Ubuntu-Raring: (informativer)
Lösung: Sie möglicherweise fehlt eine Bibliothek, die in Ihrer Zusammenstellung Schritte bei der Verlinkung der Bühne. In meinem Fall habe ich Hinzugefügt '-lz' makefile zu /GCC-flags.
Hintergrund: DSO ist ein dynamisch gemeinsam genutztes Objekt oder eine gemeinsam genutzte Bibliothek.
glewInit
müssen Sie-lGLEW
Ich fand einen anderen Fall und deshalb habe ich, was Sie alle falsch sind.
Dies ist, was ich hatte:
Das problem ist, dass die Befehlszeile NICHT enthalten
-lX11
- obwohl die libX11.so sollte Hinzugefügt werden, als eine Abhängigkeit, da gab es auch GTK und GNOME-Bibliotheken in der Argumentation.Also, die einzige Erklärung für mich ist, dass diese Nachricht möglicherweise nicht beabsichtigt gewesen zu helfen Sie, aber es nicht tun es richtig. Dies war wahrscheinlich einfach: die Bibliothek, die das symbol wurde nicht Hinzugefügt, um die Befehlszeile.
Bitte beachten Sie drei wichtige Regeln, die bezüglich der Kopplung in POSIX:
-l<name>
weiß man nie, ob es dauern wirdlib<name>.so
oderlib<name>.a
. Die dynamische Bibliothek wird bevorzugt, wenn gefunden, und statische Bibliotheken nur durchgesetzt werden kann, durch die compiler-option - das ist alles. Und ob Sie irgendwelche Probleme haben, als über, es hängt davon ab, ob Sie hatte eine statische oder dynamische BibliothekenIch fand, ich hatte den gleichen Fehler. Ich war das kompilieren ein code, der mit beiden lapack und blas. Wenn ich wechselte die Reihenfolge in der die zwei Bibliotheken wurden genannt, der Fehler ging Weg.
"LAPACK_LIB = -llapack -lblas" gearbeitet, wo
"LAPACK_LIB = -lblas -llapack" gab der oben beschriebene Fehler.
find_package(Threads)
undtarget_link_libraries( ... ${CMAKE_THREAD_LIBS_INIT})
Ich auch begegnet das gleiche problem. Ich weiß nicht, warum, ich nur hinzufügen
-lpthread
option-compiler und alles ok.Alt:
bekam folgende Fehlermeldung. Wenn ich append
-lpthread
option, um oben genannten Befehl dann auf OK.Was ich gefunden habe ist, dass manchmal der Bibliothek, die der linker beschwert sich über ist nicht die, die das problem verursacht. Vielleicht ist es ein cleverer Weg, um herauszufinden, wo das problem ist, aber das ist was ich tun:
@peter karasev: ich habe das gleiche problem mit gcc 4.8.2 cmake-Projekt auf CentOS7. Die Reihenfolge der Bibliotheken in "target_link_libraries" Abschnitt ist wichtig. Ich denke, cmake, passt einfach die Liste auf, um dem linker-ist, d.h. es nicht versuchen und herausfinden der richtigen Reihenfolge. Dies ist zumutbar - wenn man darüber nachdenkt, cmake kann nicht wissen, was ist die richtige Reihenfolge, bis die Verbindung ist erfolgreich abgeschlossen.
Bitte hinzufügen:
CFLAGS="-lrt"
undLDFLAGS="-lrt"
Hintergrund
Den
DSO missing from command line
Meldung wird angezeigt, wenn der linker nicht finden, das gewünschte symbol mit der normalen Suche, aber das symbol ist verfügbar in one die Abhängigkeiten einer direkt angegebenen dynamischen Bibliothek.In der Vergangenheit der linker-als-Symbole, die in Abhängigkeiten von bestimmten Sprachen verfügbar sein. Aber das änderte sich in einigen späteren version, und nun die linker erzwingt einen strengen Blick auf, was verfügbar ist. Die Nachricht ist somit bestimmt helfen mit, dass übergang.
, Was zu tun ist?
Wenn Sie der maintainer der software
Sollten Sie lösen dieses problem, indem sichergestellt wird, dass alle Bibliotheken, die erforderlich sind, erfüllen die erforderlichen Symbole sind direkt angegeben auf der linker-Kommandozeile. Beachten Sie auch, dass, um oft Fragen.
Wenn Sie nur versuchen, um die software zu erstellen
Als workaround ist es möglich, wechseln Sie zurück zu den toleranteren Blick auf das, was Symbole sind verfügbar mit der option
-Wl,--copy-dt-needed-entries
.Gemeinsame Wege zu injizieren, das in einen build zu export LDFLAGS vor dem ausführen
configure
oder ähnlich wie diese:Manchmal vorbei
LDFLAGS="-Wl,--copy-dt-needed-entries"
direkt zumake
könnte auch funktionieren.Das gleiche problem mit mir passiert, wenn ich
distcc
um meine c++ - Projekt;Schließlich habe ich es gelöst mit
export CXX="distcc g++"
.Das gleiche passierte mir, als ich war die Installation der HPCC-benchmark (enthält HPL und ein paar andere benchmarks). Ich fügte
-lm
an den compiler-flags in meinem build-script und dann ist es erfolgreich kompiliert.Wenn mit
g++
, stellen Sie sicher, dass Sie nicht mitgcc
statt