2010-04-15 25 views
7

我試圖針對wxWidgets構建一個程序,並且出現鏈接器錯誤。我想真正理解它的含義。錯誤是:ELF:鏈接:爲什麼我在.so文件中獲取未定義的引用

/usr/lib/libwx_baseu-2.8.so: undefined reference to `std::ctype<char>::_M_widen_init() [email protected]_3.4.11' 

我不明白的是爲什麼錯誤是在libwx_baseu-2.8.so。我認爲.so文件已解決所有符號,與.o文件仍然需要鏈接相反。

當我ldd.so,我獲得可以解決所有的鏈接庫,所以不存在問題有:

$ ldd /usr/lib/libwx_baseu-2.8.so 
linux-gate.so.1 => (0x00476000) 
libz.so.1 => /lib/libz.so.1 (0x00d9c000) 
libdl.so.2 => /lib/libdl.so.2 (0x002a8000) 
libm.so.6 => /lib/libm.so.6 (0x00759000) 
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x002ad000) 
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x0068d000) 
libpthread.so.0 => /lib/libpthread.so.0 (0x006f0000) 
libc.so.6 => /lib/libc.so.6 (0x00477000) 
/lib/ld-linux.so.2 (0x007f6000) 

是否就意味着.so文件不正確編譯(在這種情況下,它的在我的發行包中有一個錯誤),還是這意味着在我的特定程序的鏈接器命令行中缺少庫?

此外,你知道我怎樣才能得到一個ELF文件中的未定義符號列表。我試過readelf -s,但我找不到缺失的符號。

謝謝。

米爾德里德

+0

如果在鏈接時遇到問題,那麼發佈確切的鏈接器命令行可能會有幫助。 – ndim 2010-04-15 09:55:10

回答

3

我想鏈接你的程序的時候,你不要鏈接到一些庫。

你應該在你的程序鏈接到如果。所以鏈接到一些靜態庫在你的.so

鏈接到所有共享庫 - 它不是在該程序所需,如果所有需要的符號鏈接到他們在。所以發現

您可以使用nm Linux命令看到目標文件,庫或二進制

編輯符號
可以在這裏描述你的具體問題:http://old.nabble.com/-Bug-49433--gcc4.4,-NEW:-gcc4.4-misses-std::endl-implementation-at--O2%2B-td22836171.html

8

I thought that .so files had all its symbols resolved, contrary to .o files that still need linking.

共享庫可以是不完整的,即確定。

do you know how I can get a list on undefined symbols in an ELF file

使用

nm -C -u libwx_baseu-2.8.so

+0

謝謝,就是這樣,但顯然沒有缺失符號: $ nm:/usr/lib/libwx_baseu-2.8.so:沒有符號 nm:/usr/lib/libwx_baseu-2.8.so:no符號 – Mildred 2010-04-16 10:14:37

4

當對其他共享庫(例如鏈路libwx_baseu-2.8.so針對libstdc++.so),版本由libwx_baseu使用和libstdc++提供的符號鏈接器記錄鏈接的共享庫。

如果在運行時使用libstdc++(不提供相同的版本化符號)的不同副本,則會出現(動態)喜好錯誤,並且程序根本無法運行(這是晚於「神祕」崩潰)。

但是,這裏發生的事情是,你試圖鏈接一個可執行文件,這意味着(靜態)鏈接器想要找到運行時所需的所有符號。再次,您將可執行文件鏈接到不同的(較舊的)libstdc++.so,因此鏈接失敗。

有兩種常用的根源:
- 要麼你一個不同的系統(一個與海灣合作委員會的更新的版本)的鏈接libwx_baseu-2.8.so,並將其複製到當前系統,或
- 你鏈接libwx_baseu-2.8.so用更新的GCC在同一個系統上,但現在正試圖將可執行文件與舊的GCC鏈接起來。

1

嘗試:將-fno-inline 放在Makefile中的標誌中。基本上g ++ 4.4有沒有它的問題。嘗試把它或刪除-O選項。它解決了我遇到的同樣的問題。

相關問題