Openvswitch-1.5.0'ı derlerken aşağıdaki derleme hatasıyla karşılaştım:
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
Eğer libpthread
sembollerini görmeye çalışırsam, iyi görünüyor.
$ 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
Herhangi bir ipucu veya ipucu verebilir misiniz?
Kütüphaneyi komut satırında derlenen nesne dosyalarından sonra belirtmelisiniz:
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
Açıklama: bağlantı modüllerin sırasına bağlıdır. Semboller önce talep edilir ve daha sonra bunlara sahip olan bir kütüphaneden bağlanır. Bu nedenle, önce kütüphaneleri kullanan modülleri ve onlardan sonra kütüphaneleri belirtmeniz gerekir. Bunun gibi:
gcc x.o y.o z.o -la -lb -lc
Ayrıca, döngüsel bir bağımlılık olması durumunda, aynı kütüphaneyi komut satırında birkaç kez belirtmeniz gerekir. Yani libb
libc
sembolüne ihtiyaç duyuyorsa ve libc
libb
sembolüne ihtiyaç duyuyorsa, komut satırı şöyle olmalıdır:
gcc x.o y.o z.o -la -lb -lc -lb
Hata mesajı dağıtım / derleyici sürümüne bağlıdır:
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: (daha bilgilendirici)
/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
Çözüm: Derleme adımlarınızda, bağlama aşamasında bir kütüphane eksik olabilir. Benim durumumda, makefile / GCC bayraklarına '-lz' ekledim.
Arka plan: DSO, dinamik bir paylaşılan nesne veya paylaşılan bir kütüphanedir.
Aynı hatayı aldığımı fark ettim. Hem lapack hem de blas ile bir kod derliyordum. İki kütüphanenin çağrılma sırasını değiştirdiğimde hata ortadan kalktı.
"LAPACK_LIB = -llapack -lblas" burada çalıştı "LAPACK_LIB = -lblas -llapack" yukarıda açıklanan hatayı verdi.