gcc - 奇怪的鏈接錯誤:命令行中缺少DSO




makefile undefined reference to (6)

在編譯目標文件之後 ,應該在命令行中提到庫:

 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 x.o y.o z.o -la -lb -lc

此外,如果存在循環依賴性,則應多次在命令行上指定相同的庫。 因此,如果libb需要來自libc符號,並且libc需要來自libb符號,那麼命令行應該是:

gcc x.o y.o z.o -la -lb -lc -lb

當我編譯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 '[email protected]@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 [email protected]@GLIBC_2.2.5
   173: 0000000000008220  2814 FUNC    LOCAL  DEFAULT   13 __pthread_create_2_1
   462: 0000000000008220  2814 FUNC    GLOBAL DEFAULT   13 [email protected]@GLIBC_2.2

你能提供任何提示或指針嗎?


我也遇到了同樣的問題。 我不知道為什麼,我只是將-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 '[email protected]@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

我發現了另一個案子,所以我說你全錯了。

這就是我所擁有的:

/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<name>指定庫時,您永遠不知道它是否會使用lib<name>.solib<name>.a 。 動態庫是首選的,如果找到了,靜態庫只能通過編譯器選項強制執行 - 就這些了。 不管你是否有上述問題,這取決於你是否有靜態或動態庫
  • 那麼,有時動態庫中可能缺少依賴關係:D

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

“LAPACK_LIB = -llapack -lblas”在其中“LAPACK_LIB = -lblas -llapack”給出了上述錯誤。


當我使用distcc創建我的c ++項目時,同樣的問題發生在我身上; 最後我用export CXX="distcc g++"解決了它。


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





undefined-reference