libpthread.so.0: fout bij het toevoegen van symbolen: DSO ontbreekt op opdrachtregel

Bij het compileren van openvswitch-1.5.0 ben ik de volgende compileerfout tegengekomen:

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

Als ik de symbolen van libpthreadprobeer te zien, ziet het er goed uit.

$ 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

Kunt u hints of aanwijzingen geven?


Antwoord 1, autoriteit 100%

U moet de bibliotheek op de opdrachtregel vermelden nade objectbestanden die worden gecompileerd:

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 

Uitleg: de koppeling is afhankelijk van de volgorde van modules. Symbolen worden eerst aangevraagd en vervolgens gekoppeld vanuit een bibliotheek die ze heeft. U moet dus modules specificeren die eerst bibliotheken gebruiken en daarna bibliotheken. Zoals dit:

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

Bovendien, als er sprake is van een circulaire afhankelijkheid, moet u dezelfde bibliotheek meerdere keren op de opdrachtregel opgeven. Dus in het geval dat libbeen symbool van libcnodig heeft en libceen symbool van libbnodig heeft, moet de opdrachtregel zijn:

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

Antwoord 2, autoriteit 28%

De foutmelding is afhankelijk van de distributie / compiler versie:

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: (meer informatief)

/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

Oplossing: U mag ontbreken een bibliotheek in uw compilatie stappen, tijdens het koppelen van het podium. In mijn geval, voegde ik ‘-lZ’ to makefile / GCC vlaggen.

Achtergrond:. DSO is een dynamische gedeelde object of een gedeelde bibliotheek


3, Autoriteit 19%

Achtergrond

DSO missing from command linebericht wordt weergegeven wanneer de linker niet vinden het gewenste symbool met het normaal zoeken, maar het symbool is beschikbaar in een van de bijgebouwen van een direct opgegeven dynamische bibliotheek.

In het verleden de linker beschouwd als symbolen in afhankelijkheid van bepaalde talen beschikbaar zijn. Maar dat veranderde in een latere versie en nu de linker dwingt een meer strikte weergave van wat er beschikbaar is. De boodschap dus is bedoeld om te helpen met deze overgang.

Wat te doen?

Als u de handhaver van de software

U moet dit probleem oplossen door ervoor te zorgen dat alle bibliotheken die nodig zijn om de benodigde symbolen voldoen direct worden opgegeven op de linker-opdrachtregel. Ook in gedachten houden dat de volgorde vaak doet.

Als u alleen maar proberen om de software te compileren

Als een oplossing is het mogelijk om terug te schakelen naar de meer toegestane weergave van welke symbolen beschikbaar zijn met behulp van de optie -Wl,--copy-dt-needed-entries.

Gemeenschappelijke manieren om dit in een build te injecteren, zijn om LDFLAG’s te exporteren voordat u configureof vergelijkbaar als volgt:

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

Soms passeren LDFLAGS="-Wl,--copy-dt-needed-entries"rechtstreeks op makekan ook werken.


4, Autoriteit 4%

Ik heb gevonden dat ik dezelfde fout had. Ik verzamel een code met zowel Lapack en Blas. Toen ik de volgorde overging waar de twee bibliotheken de fout werd genoemd, gingen de fout weg.

“lapack_lib = -Lllapack -lblas” werkte waar
“LAPACK_LIB = -LBLAS -LLLAPACK” gaf de hierboven beschreven fout.


5, Autoriteit 4%

Ik ben ook hetzelfde probleem tegengekomen. Ik weet niet waarom, ik voeg gewoon -lpthreadoptie toe aan compiler en alles OK.

OUD:

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

Naar aanstaande fout. Als ik -lpthread-optie toevoegen aan bovenstaande opdracht dan OK.

/usr/bin/ld: /tmp/node/out/Release/obj.host/v8_libbase/deps/v8/src/base/platform/condition-variable.o: undefined reference to symbol 'pthread_condattr_setclock@@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

6

Wat ik heb gevonden, is dat soms de bibliotheek waarover de linker hierover klaagt, is niet degene die het probleem veroorzaakt. Mogelijk is er een slimme manier om uit te werken waar het probleem is, maar dit is wat ik doe:

  • Comment alle gekoppelde bibliotheken in de koppelingscommando.
  • Reinig alle .o’s, .so’s enz. (Meestal maakt het schoon, maar misschien wil je een recursieve vondst + rm uitvoeren, of iets dergelijks).
  • Uncomment De bibliotheken in de link opdracht één voor één en regelen de bestelling zo nodig.

@Peter Karasev: Ik ben hetzelfde probleem tegengekomen met een GCC 4.8.2 CMAKE-project op Centos7. De volgorde van de bibliotheken in het gedeelte “Target_Link_Libraries” is belangrijk. Ik denk dat Cmake de lijst gewoon doorgeeft aan de linker als-is, d.w.z. het probeert niet de juiste volgorde uit te werken. Dit is redelijk – wanneer u erover nadenkt CMAAKE kan niet weten wat de juiste volgorde is totdat de koppeling met succes is voltooid.


7

Voeg toe: CFLAGS="-lrt"EN LDFLAGS="-lrt"


8

Als u CMAKE gebruikt, zijn er enkele manieren waarop u het zou kunnen oplossen:

oplossing 1: de meest elegante

add_executable(...)
target_include_directories(...)
target_link_libraries(target_name pthread)

Oplossing 2: Mening CMAKE find_package

find_package(Threads REQUIRED) # this will generate the flag for CMAKE_THREAD_LIBS_INIT
add_executable(...)
target_include_directories(...)
target_link_libraries(target_name ${CMAKE_THREAD_LIBS_INIT})

Oplossing 3: Cmake vlaggen wijzigen

# e.g. with C++ 17, change to other version if you need
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -pthread")

9

Hetzelfde probleem is er met mij gebeurd als ik distccgebruik om mijn C++ -project te maken;
Eindelijk loste ik het op met export CXX="distcc g++".


10

Probeer -pthreadaan het einde van de bibliotheeklijst in de M MAKEFILE toe te voegen.

het werkte voor mij.


11

Probeer de volgende regels

als u cmake en gebruikte pthreads gebruikt

find_package(Threads)
target_link_libraries(${CMAKE_THREAD_LIBS_INIT})

12

Bij het werken met code die wiskundige functies gebruikt, moet u ze ook koppelen.
In mijn geval verstrekte ik het volgende, dat voor mij werkte.

mpicc -o testname testname.c -lm

13

Hetzelfde gebeurde met mij toen ik de HPCC-benchmark installeerde (inclusief HPL en een paar andere benchmarks). Ik heb -lmtoegevoegd aan de compiler-vlaggen in mijn build-script en dan is het met succes gecompileerd.


14

Compileer in plaats daarvan met G ++. Het heeft in mijn geval gewerkt om van GCC naar G ++ te schakelen.

Other episodes