Wanneer ik openvswitch-1.5.0 aan het compileren ben, 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 enige hints of aanwijzingen geven?
U moet de bibliotheek op de opdrachtregel vermelden na de 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: het linken is afhankelijk van de volgorde van de modules. Symbolen worden eerst opgevraagd, en dan gekoppeld vanuit een bibliotheek die ze heeft. Je moet dus modules die bibliotheken gebruiken eerst opgeven, en bibliotheken daarna. Op deze manier:
gcc x.o y.o z.o -la -lb -lc
Bovendien, in het geval dat er'een circulaire afhankelijkheid is, moet je dezelfde bibliotheek meerdere keren specificeren op de commandoregel. Dus in het geval libb
symbool van libc
nodig heeft en libc
symbool van libb
nodig heeft, zou de commandoregel moeten zijn:
gcc x.o y.o z.o -la -lb -lc -lb
De foutmelding hangt af 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: Het kan zijn dat je een bibliotheek mist in je compilatiestappen, tijdens de linking fase. In mijn geval heb ik '-lz' toegevoegd aan makefile / GCC flags.
Achtergrond: DSO is een dynamisch gedeeld object of een gedeelde bibliotheek.
Ik ontdekte dat ik dezelfde fout had. Ik was een code aan het compileren met zowel lapack als blas. Toen ik de volgorde verwisselde waarin de twee bibliotheken werden aangeroepen, ging de fout weg.
"LAPACK_LIB = -llapack -lblas" werkte waar "LAPACK_LIB = -lblas -llapack" gaf de hierboven beschreven fout.