天天看點

linux6.缺少指令行,奇怪的連結錯誤:指令行中缺少DSO

奇怪的連結錯誤:指令行中缺少DSO

當我編譯openvswitch-1.5.0時,遇到以下編譯錯誤:

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

如果我嘗試看libpthread的符号,它看起來很好。

$ 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

你可以提供任何提示或指針?

在編譯目标檔案之後 ,應該在指令行上提到庫:

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

說明:連結取決于子產品的順序。 首先請求符号,然後從具有它們的庫中連結。 是以你必須指定首先使用庫的子產品,以及庫之後的庫。 喜歡這個:

gcc xo yo zo -la -lb -lc

而且,如果存在循環依賴,則應多次在指令行上指定相同的庫。 是以如果libb需要libc符号,而libc需要libb符号,指令行應該是:

gcc xo yo zo -la -lb -lc -lb

谷歌帶領我在這裡..是以對于其他類似的問題

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:我收到了更多資訊的錯誤消息

/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

解決方案:将“-lz”添加到makefile / GCC标志。 換句話說,在連結階段,您隻需在編譯步驟中丢失一個庫。

為了擴充,DSO是一個動态共享對象,換句話說就是一個共享庫

我發現了另外一個案子,是以我說你們都錯了。

這是我的:

/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

問題是指令行DID不包含-lX11 – 雖然libX11.so應該作為依賴項添加,因為在參數中也有GTK和GNOME庫。

是以,對我來說唯一的解釋是這個消息可能是為了幫助你 ,但是沒有做好。 這可能很簡單:提供符号的庫不會添加到指令行中。

請注意有關POSIX連結的三個重要規則:

動态庫已經定義了依賴關系,是以隻有頂級依賴的庫應該以任何順序提供(盡管在靜态庫之後)

靜态庫隻有未定義的符号 – 取決于你自己的依賴關系,并在指令行中提供它們

靜态庫中的順序總是: 先請求者 ,然後是提供者 。 否則,您會收到未定義的符号消息,就像您忘記将庫添加到指令行一樣

當您使用-l指定庫時,您永遠不知道是否會使用lib.so或lib.a 。 動态庫是最好的,如果找到了,靜态庫隻能通過編譯器選項強制 – 這就是全部。 不管你有什麼問題,這取決于你是否有靜态或動态庫

那麼,有時在動态庫中可能會缺少依賴關系:D

我發現我有同樣的錯誤。 我正在編譯一個包含lapack和blas的代碼。 當我改變這兩個圖書館的指令時,錯誤消失了。

“LAPACK_LIB = -llapack -lblas”在“LAPACK_LIB = -lblas -llapack”給出上述錯誤的地方工作。

我發現的是有時連接配接器所抱怨的庫不是引起問題的庫。 可能有一個聰明的方法來解決問題的地方,但這是我所做的:

在連結指令中注釋掉所有連結的庫。

清理掉所有的.o's,.so等等(通常清理就足夠了,但是你可能想運作一個遞歸的find + rm或類似的東西)。

取消連結指令中的庫的注釋,并根據需要重新排列順序。

@peter karasev:我在CentOS7上遇到過與gcc 4.8.2 cmake項目相同的問題。 “target_link_libraries”部分中的庫的順序非常重要。 我想cmake隻是将連結清單按照原樣傳遞給連結器,也就是說,它不會嘗試正确的順序。 這是合理的 – 當你想到它,cmake不能知道正确的順序是什麼,直到連結成功完成。

我也遇到了同樣的問題。 我不知道為什麼,我隻是添加-lpthread選項編譯器,一切正常。

舊:

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

有以下錯誤。 如果我将-lpthread選項添加到上面的指令然後确定。

/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

請添加: CFLAGS="-lrt"和LDFLAGS="-lrt"

同樣的事情發生在我身上,因為我正在安裝HPCC基準(包括HPL和其他一些基準測試)。 我在建構腳本中向編譯器标志添加了-lm ,然後成功編譯。