Când m-am'm compilarea openvswitch-1.5.0, am'am întâlnit următoarea eroare de compilare:
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
Dacă am încerca să vedem simbolurile de libpthread`, arată bine.
$ 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
Ai putea da orice sugestii sau sfaturi?
Ar trebui să menționez biblioteca de pe linia de comandă după fișierele obiect compilat:
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
Explicație: legarea este dependentă de ordine de module. Simbolurile sunt mai întâi solicitată, și apoi legat de o bibliotecă care le are. Deci, trebuie să specificați module care folosesc biblioteci în primul rând, și biblioteci după ei. Astfel:
gcc x.o y.o z.o -la -lb -lc
Mai mult decât atât, în cazul în care nu's o dependență circulară, trebuie să specificați aceeași bibliotecă în linia de comandă de mai multe ori. Deci, în cazul în care libb
are nevoie de simbol din libc " și " libcare nevoie de simbol din
libb`, linia de comandă trebuie să fie:
gcc x.o y.o z.o -la -lb -lc -lb
Mesajul de eroare depinde de distribuție / compiler versiune:
Ubuntu Cochet:
/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: (mai multe informații)
/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
Soluție: s-ar putea lipsi o bibliotecă în elaborarea pași, timpul care leagă scena. În cazul meu, am adăugat '-lz' pentru makefile / GCC steaguri.
Context: DSO este un obiect dinamic partajat sau o bibliotecă partajată.
Am găsit un alt caz și, prin urmare, cred că sunt toate greșite.
Aceasta este ceea ce am avut:
/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
Problema este că linia de comandă NU conține -lX11
- deși libX11.deci, ar trebui să fie adăugate ca o dependență pentru că acolo au fost, de asemenea, GTK și GNOME biblioteci în argumente.
Deci, singura explicație pentru mine este că acest mesaj ar fi fost destinat să vă ajute, dar nu't-l faci corect. Acest lucru a fost, probabil, simplu: bibliotecă care oferă simbolul nu a fost adăugat la linia de comandă.
Vă rugăm să rețineți trei reguli importante privind hidraulic POSIX:
-l<numele>
, nu știi niciodată dacă va lua lib<numele>.deci " sau " lib<numele>.o
. Biblioteca dinamică este de preferat, dacă este găsit, și biblioteci statice numai poate fi executată de către compilator opțiune - ca's toate. Și dacă aveți orice probleme ca mai sus, depinde dacă ai avut statice sau dinamice biblioteciAm găsit eu am avut aceeasi eroare. Am fost elaborarea unui cod cu atât lapack și blas. Când m-am schimbat pentru că cele două biblioteci au fost numite de eroare plecat.
"LAPACK_LIB = -llapack -lblas" a lucrat în cazul în care "LAPACK_LIB = -lblas -llapack" a dat eroare descrise mai sus.
Am întâlnit, de asemenea, aceeași problemă. Nu știu de ce, am adăuga -lpthread
opțiunea de a compiler și totul ok.
Vechi:
$ g++ -rdynamic -m64 -fPIE -pie -o /tmp/node/out/Release/mksnapshot ...*.o *.a -ldl -lrt
am următoarea eroare. Dacă am adăuga -lpthread
opțiunea de a comanda de mai sus apoi 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
Fundal
Anii DSO lipsește de la linia de comandă
mesaj va fi afișat atunci când linker-ul nu găsește necesar simbol cu l's de căutare normal, dar simbolul este disponibil într-una din dependențele de un specificate direct bibliotecă dinamică.
În trecut, linker considerate simboluri în dependențele dintre limbile specificate să fie disponibile. Dar asta s-a schimbat în unele versiune ulterioară și acum linker-ul impune o mai strictă vedere a ceea ce este disponibil. Mesajul, astfel, este destinat pentru a ajuta cu această tranziție.
Ce să fac?
Dacă sunteți operator de întreținere a software-ului
Tu ar trebui să rezolve această problemă prin asigurându-vă că toate bibliotecile care sunt necesare pentru a satisface nevoie de simboluri sunt specificate direct pe linker command line. De asemenea, să păstreze în minte faptul că de multe ori pentru chestiuni.
Dacă sunteți doar încercarea de a compila software-ul
Ca o soluție it's posibil pentru a comuta înapoi la mai permisive vedere a ceea ce simboluri sunt disponibile utilizând opțiunea `-Wl, - copie-dt-nevoie-intrări.
Modalități comune de a injecta într-o construiesc sunt pentru export LDFLAGS înainte de a rula "configurare" sau similare, de genul asta:
export LDFLAGS="-Wl, - copie-dt-nevoie-de intrări"
Uneori trece LDFLAGS="-Wl, - copie-dt-nevoie-de intrări"
direct la "a face" s-ar putea lucra, de asemenea.
Ceea ce am descoperit este că, uneori, bibliotecă, că linker plânge nu este cea care cauzează problema. Este posibil să existe un mod inteligent de a lucra în cazul în care problema este dar asta este ceea ce fac:
@peter karasev: am dat peste aceeasi problema cu un gcc 4.8.2 cmake proiect pe CentOS7. Ordinea de biblioteci în "target_link_libraries" secțiune este important. Cred cmake trece pe lista de pe la linker ca-este, adică nu't a încerca și de a lucra în ordinea corectă. Acest lucru este rezonabil - când te gândești la asta cmake poate't știu ce ordinea corectă este de până la legarea este finalizat cu succes.