Beim Kompilieren von openvswitch-1.5.0 ist der folgende 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 '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, die Symbole von zu sehen libpthread
, sieht es 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önnten Sie irgendwelche Hinweise oder Hinweise geben?
gcc
nichtg++
Antworten:
Sie sollten die Bibliothek in der Befehlszeile nach dem Kompilieren der Objektdateien erwähnen :
Erläuterung: Die Verknüpfung hängt von der Reihenfolge der Module ab. Symbole werden zuerst angefordert und dann aus einer Bibliothek mit ihnen verknüpft. Sie müssen also Module angeben, die zuerst Bibliotheken und danach Bibliotheken verwenden. So was:
Darüber hinaus sollten Sie bei einer zirkulären Abhängigkeit dieselbe Bibliothek mehrmals in der Befehlszeile angeben. Für den Fall, dass ein
libb
Symbol vonlibc
und einlibc
Symbol von benötigt wirdlibb
, sollte die Befehlszeile wie folgt lauten:quelle
-Wl,--start-group -la -lb- -lc -Wl,--end-group
für zirkuläre Abhängigkeiten tun .Die Fehlermeldung hängt von der Distribution / Compiler-Version ab:
Ubuntu Saucy:
Ubuntu Raring: (informativer)
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.
Hintergrund: DSO ist ein dynamisches freigegebenes Objekt oder eine gemeinsam genutzte Bibliothek.
quelle
glewInit
, Sie brauchen-lGLEW
Hintergrund
Die
DSO missing from command line
Meldung wird angezeigt, wenn der Linker das erforderliche 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 betrachtete der Linker Symbole in Abhängigkeiten bestimmter Sprachen als verfügbar. Dies hat sich jedoch in einer späteren Version geändert, und jetzt erzwingt der Linker eine strengere Sicht auf das, was verfügbar ist. Die Nachricht soll somit 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 benötigt werden, direkt in der Linker-Befehlszeile angegeben sind. 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 mithilfe der Option wieder in die freizügigere Ansicht der verfügbaren Symbole wechseln
-Wl,--copy-dt-needed-entries
.Übliche Methoden, um dies in einen Build einzufügen, sind das Exportieren von LDFLAGS vor dem Ausführen
configure
oder ähnliches:Manchmal funktioniert es auch,
LDFLAGS="-Wl,--copy-dt-needed-entries"
direkt an zu gehenmake
.quelle
-Wl,
Bit, oder Sie haben einen Linker, der diese Optionen nicht unterstützt. Welchen Linker verwendest du? Diese Antwort setzt den klassischen binutils-Linker (ld.bfd) voraus. Der binutils gold linker (ld.gold) dokumentiert--copy-dt-needed-entries
als "Nicht unterstützt". Wenn Sie diesen (oder einen anderen Linker, der diese Option nicht unterstützt) als Standard haben, müssen Sie möglicherweise dem Abschnitt für Betreuer folgen oder zum Verknüpfen zum klassischen ld wechseln. Ich denke, Sie können dafür verwenden-fuse-ld=ld.bfd
.Ich habe einen anderen Fall gefunden und deshalb bin ich der Meinung, dass Sie alle falsch liegen.
Das hatte ich:
Das Problem ist, dass die Befehlszeile NICHT enthielt
-lX11
- obwohl 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 möglicherweise 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 bezüglich der Verknüpfung in POSIX:
-l<name>
, wissen Sie nie, oblib<name>.so
oderlib<name>.a
. 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 wie oben beschrieben Probleme haben, hängt davon ab, ob Sie statische oder dynamische Bibliotheken hattenquelle
Ich stellte fest, dass ich den gleichen Fehler hatte. Ich habe einen Code mit Lapack und Blas kompiliert. Als ich die Reihenfolge wechselte, in der die beiden Bibliotheken aufgerufen wurden, verschwand der Fehler.
"LAPACK_LIB = -llapack -lblas" funktionierte, wobei "LAPACK_LIB = -lblas -llapack" den oben beschriebenen Fehler ergab.
quelle
find_package(Threads)
undtarget_link_libraries( ... ${CMAKE_THREAD_LIBS_INIT})
Ich bin auch auf das gleiche Problem gestoßen. Ich weiß nicht warum, ich füge nur eine
-lpthread
Option zum Compiler hinzu und alles in Ordnung.Alt:
habe folgenden Fehler bekommen. Wenn ich die
-lpthread
Option an den obigen Befehl anhänge , dann OK.quelle
Was ich gefunden 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 Möglichkeit, herauszufinden, wo das Problem liegt, aber das mache ich:
@ Peter Karasev: Ich bin auf dasselbe Problem mit einem gcc 4.8.2 cmake-Projekt unter CentOS7 gestoßen. Die Reihenfolge der Bibliotheken im Abschnitt "target_link_libraries" ist wichtig. Ich denke, cmake gibt die Liste einfach so wie sie ist an den Linker weiter, dh 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 ist, bis die Verknüpfung erfolgreich abgeschlossen wurde.
quelle
Bitte hinzufügen:
CFLAGS="-lrt"
undLDFLAGS="-lrt"
quelle
Das gleiche Problem ist mir passiert, als ich
distcc
mein C ++ - Projekt erstellt habe. Endlich habe ich es mit gelöstexport CXX="distcc g++"
.quelle
Wenn Sie cmake und pthreads verwenden, fügen Sie die folgenden Zeilen hinzu
quelle
Das gleiche passierte mir bei der Installation des HPCC-Benchmarks (einschließlich HPL und einiger anderer Benchmarks). Ich
-lm
habe die Compiler-Flags in meinem Build-Skript hinzugefügt und dann erfolgreich kompiliert.quelle
Stellen Sie bei Verwendung
g++
sicher, dass Sie nichtgcc
stattdessen ausgeführt werdenquelle
Versuchen Sie,
-pthread
am Ende der Bibliotheksliste im Makefile hinzuzufügen .Es hat bei mir funktioniert.
quelle
Wenn Sie CMake verwenden, gibt es einige Möglichkeiten, wie Sie es lösen können:
Lösung 1: Die eleganteste
Lösung 2: Verwenden von CMake
find_package
Lösung 3: Ändern Sie die CMake-Flags
quelle