web-dev-qa-db-de.com

libpthread.so.0: Fehler beim Hinzufügen von Symbolen: DSO fehlt in der Befehlszeile

Beim Kompilieren von openvswitch-1.5.0 ist folgender Kompilierungsfehler aufgetreten:

 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 '[email protected]@GLIBC_2.2.5'
     /lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from 
     command line

Wenn ich versuche, die Symbole von libpthread zu sehen, sieht es gut aus.

$ readelf -s /lib/x86_64-linux-gnu/libpthread.so.0 | grep pthread_create
   199: 0000000000008220  2814 FUNC    GLOBAL DEFAULT   13 [email protected]@GLIBC_2.2.5
   173: 0000000000008220  2814 FUNC    LOCAL  DEFAULT   13 __pthread_create_2_1
   462: 0000000000008220  2814 FUNC    GLOBAL DEFAULT   13 [email protected]@GLIBC_2.2

Könntest du irgendwelche Tipps oder Hinweise geben?

178
jaeyong

Sie sollten die Bibliothek in der Befehlszeile erwähnen nach die Objektdateien, die kompiliert werden:

 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 -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 -lpthread 

Erklärung: Die Verknüpfung ist abhängig von der Reihenfolge der Module. Symbole werden zuerst angefordert und dann aus einer Bibliothek, die sie enthält, eingebunden. Sie müssen also zuerst Module angeben, die Bibliotheken verwenden, und danach Bibliotheken. So was:

gcc x.o y.o z.o -la -lb -lc

Darüber hinaus sollten Sie im Falle einer zirkulären Abhängigkeit dieselbe Bibliothek mehrmals in der Befehlszeile angeben. Falls libb ein Symbol von libc und libc ein Symbol von libb benötigt, sollte die Befehlszeile folgendermaßen lauten:

gcc x.o y.o z.o -la -lb -lc -lb
137
Michael Pankov

Die Fehlermeldung ist abhängig von der Distributions-/Compilerversion:

Ubuntu Saucy:

/usr/bin/ld: /mnt/root/ffmpeg-2.1.1//libavformat/libavformat.a(http.o): undefined reference to symbol 'inflateInit2_'
/lib/x86_64-linux-gnu/libz.so.1: error adding symbols: DSO missing from command line

Ubuntu Raring: (informativer)

/usr/bin/ld: note: 'uncompress' is defined in DSO /lib/x86_64-linux-gnu/libz.so.1 so try adding it to the linker command line

Lösung: Während der Verknüpfungsphase fehlt möglicherweise eine Bibliothek in Ihren Kompilierungsschritten. In meinem Fall habe ich '-lz' zu makefile/GCC Flags hinzugefügt.

Background: DSO ist ein dynamisches gemeinsames Objekt oder eine gemeinsame Bibliothek.

45
kevinf

Ich habe einen anderen Fall gefunden und deshalb bin ich der Meinung, dass Sie alle falsch liegen.

Das hatte ich:

/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: eggtrayicon.o: undefined reference to symbol 'XFlush'
/usr/lib64/libX11.so.6: error adding symbols: DSO missing from command line

Das Problem ist, dass die Befehlszeile DID NICHT -lX11 enthält - obwohl die libX11.so als Abhängigkeit hinzugefügt werden sollte, da die Argumente auch GTK- und GNOME-Bibliotheken enthielten.

Die einzige Erklärung für mich ist, dass diese Nachricht vielleicht dazu gedacht war Ihnen zu helfen, aber sie hat es nicht richtig gemacht. Dies war wahrscheinlich einfach: Die Bibliothek, die das Symbol bereitstellt, wurde nicht zur Befehlszeile hinzugefügt.

Bitte beachten Sie drei wichtige Regeln zur Verlinkung in POSIX:

  • Dynamische Bibliotheken haben definierte Abhängigkeiten, daher sollten nur Bibliotheken aus der obersten Abhängigkeit in beliebiger Reihenfolge bereitgestellt werden (obwohl nach den statischen Bibliotheken).
  • Statische Bibliotheken haben nur undefinierte Symbole - es liegt an Ihnen, ihre Abhängigkeiten zu kennen und alle in der Befehlszeile bereitzustellen
  • Die Reihenfolge in statischen Bibliotheken ist immer: Anforderer zuerst, Anbieter folgt. Andernfalls erhalten Sie eine undefinierte Symbolmeldung, genau wie wenn Sie vergessen haben, die Bibliothek zur Befehlszeile hinzuzufügen
  • Wenn Sie die Bibliothek mit -l<name> angeben, wissen Sie nie, ob es lib<name>.so oder lib<name>.a dauern wird. Die dynamische Bibliothek wird bevorzugt, wenn sie gefunden wird, und statische Bibliotheken können nur durch die Compileroption erzwungen werden - das ist alles. Und ob Sie Probleme wie oben haben, hängt davon ab, ob Sie statische oder dynamische Bibliotheken hatten
  • Nun, manchmal fehlen die Abhängigkeiten in dynamischen Bibliotheken: D
14
Ethouris

Ich fand, ich hatte den gleichen Fehler. Ich habe einen Code mit Lapack und Blas kompiliert. Als ich die Reihenfolge geändert habe, in der die beiden Bibliotheken aufgerufen wurden, ist der Fehler behoben.

"LAPACK_LIB = -llapack -lblas" funktionierte, wobei "LAPACK_LIB = -lblas -llapack" den oben beschriebenen Fehler ergab.

6
user3112632

Ich bin auch auf das gleiche Problem gestoßen. Ich weiß nicht warum, ich füge nur die Option -lpthread zum Compiler hinzu und alles in Ordnung.

Alt:

$ g++ -rdynamic -m64 -fPIE -pie  -o /tmp/node/out/Release/mksnapshot ...*.o *.a -ldl -lrt

bekam folgenden Fehler. Wenn ich die Option -lpthread an den obigen Befehl anhänge, dann OK.

/usr/bin/ld: /tmp/node/out/Release/obj.Host/v8_libbase/deps/v8/src/base/platform/condition-variable.o: undefined reference to symbol '[email protected]@GLIBC_2.3.3'
//lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
4
osexp2003

Hintergrund

Die Meldung DSO missing from command line wird angezeigt, wenn der Linker das gewünschte Symbol bei seiner normalen Suche nicht findet, das Symbol jedoch in einer der Abhängigkeiten einer direkt angegebenen dynamischen Bibliothek verfügbar ist.

In der Vergangenheit hielt der Linker Symbole in Abhängigkeiten der angegebenen Sprachen für verfügbar. Aber das hat sich in einer späteren Version geändert und jetzt erzwingt der Linker eine strengere Sicht auf das, was verfügbar ist. Die Nachricht soll daher bei diesem Übergang helfen.

Was ist zu tun?

Wenn Sie der Betreuer der Software sind

Sie sollten dieses Problem lösen, indem Sie sicherstellen, dass alle Bibliotheken, die zur Erfüllung der erforderlichen Symbole erforderlich sind, direkt in der Linker-Befehlszeile angegeben werden. Denken Sie auch daran, dass die Reihenfolge oft wichtig ist.

Wenn Sie nur versuchen, die Software zu kompilieren

Um dieses Problem zu umgehen, können Sie mit der Option -Wl,--copy-dt-needed-entries zurück zur freigebigeren Ansicht wechseln, welche Symbole verfügbar sind.

Übliche Möglichkeiten, dies in einen Build einzufügen, sind das Exportieren von LDFLAGS vor dem Ausführen von configure oder einer ähnlichen Methode:

export LDFLAGS="-Wl,--copy-dt-needed-entries"

Manchmal funktioniert es auch, LDFLAGS="-Wl,--copy-dt-needed-entries" direkt an make zu übergeben.

3
textshell

Bitte fügen Sie hinzu: CFLAGS="-lrt" und LDFLAGS="-lrt"

2
劉大為

Was ich festgestellt habe, ist, dass manchmal die Bibliothek, über die sich der Linker beschwert, nicht diejenige ist, die das Problem verursacht. Möglicherweise gibt es eine clevere Methode, um herauszufinden, wo das Problem liegt, aber ich mache Folgendes:

  • Kommentieren Sie alle verknüpften Bibliotheken im Befehl link aus.
  • Bereinigen Sie alle .o, .so usw. (Normalerweise reicht make clean aus, aber Sie möchten möglicherweise einen rekursiven find + rm oder ähnliches ausführen).
  • Kommentieren Sie die Bibliotheken nacheinander im Link-Befehl aus und ordnen Sie die Reihenfolge nach Bedarf neu.

@peter karasev: Ich bin auf dasselbe Problem mit einem gcc 4.8.2 cmake-Projekt auf CentOS7 gestoßen. Die Reihenfolge der Bibliotheken im Abschnitt "target_link_libraries" ist wichtig. Ich denke, cmake leitet die Liste einfach so wie sie ist an den Linker weiter, d. H. Es wird nicht versucht, die richtige Reihenfolge zu ermitteln. Dies ist vernünftig - wenn Sie darüber nachdenken, kann cmake nicht wissen, wie die richtige Reihenfolge lautet, bis die Verknüpfung erfolgreich abgeschlossen wurde.

2
AhrB

Das gleiche Problem ist mir passiert, als ich distcc verwende, um mein c ++ - Projekt zu erstellen. Schließlich habe ich es mit export CXX="distcc g++" gelöst.

1
Jason Geng

Wenn Sie g++ verwenden, stellen Sie sicher, dass Sie nicht gcc ausführen

0
Martin R.

Mir ist das Gleiche passiert, als ich den HPCC-Benchmark installiert habe (einschließlich HPL und einiger anderer Benchmarks). Ich habe -lm zu den Compiler-Flags in meinem Build-Skript hinzugefügt und dann erfolgreich kompiliert.

0
Jon Doh