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 libpthread
probeer 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 libb
een symbool van libc
nodig heeft en libc
een symbool van libb
nodig 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 line
bericht 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 configure
of vergelijkbaar als volgt:
export LDFLAGS="-Wl,--copy-dt-needed-entries"
Soms passeren LDFLAGS="-Wl,--copy-dt-needed-entries"
rechtstreeks op make
kan 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 -lpthread
optie 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 distcc
gebruik om mijn C++ -project te maken;
Eindelijk loste ik het op met export CXX="distcc g++"
.
10
Probeer -pthread
aan 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 -lm
toegevoegd 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.