2010-06-28 212 views
4

我試圖構建一個共享庫,我也得到了以下錯誤:GCC連接錯誤:版本節點沒有找到符號

libavformat.so: version node not found for symbol [email protected]_52

ld: failed to set dynamic section sizes: Bad value

有誰知道這個錯誤是什麼意思?主機是i586的Linux的目標是arm-linux的

編輯:解決,看評論

+1

請張貼的gcc你使用兩種編譯和鏈接的參數。 – 2010-06-28 14:44:42

+0

我擺脫了錯誤 - 它是特定於庫,由內置Assey.symver指令 – ognian 2010-06-28 14:54:15

+1

引起的,您可以在此處發佈解決方案作爲回答 – 2010-06-28 14:55:18

回答

2

它是由一條內聯彙編指令.symver引起的。我的解決方案是手動修改生成的config.h以禁用版本節點符號。

退房internal.h線214-223

0

它拿了別人指出這一點給我,所以我想我還不如把它放在這裏,以便其他人喜歡我能理解ognian的回答是:

這相當於編輯config.h運行./configure並使SYMVER - 相關條目設置爲0,像這樣經過:

#define HAVE_SYMVER 0 
#define HAVE_SYMVER_GNU_ASM 0 
#define HAVE_SYMVER_ASM_LABEL 0 
1

哦,功能was moved in April 2009libavformat/util.clibavcodec/avpacket.c中的新文件。該comment in internal.h國家明確:

If a function is moved from one library to another, a wrapper must be retained in the original location to preserve binary compatibility.

但它是不可能的,當一個函數庫之間移動時保持二進制兼容性。

請注意,一年多前在Chromium project中報告了此錯誤。

順便說一句,沒有必要手動編輯config.h:您可以運行./configure --disable-symver

+1

實際上,在本版本中使用的FFmpeg版本中(r25864從2010年12月開始),'--disable-symver'選項不存在,所以手動編輯是必需的。不過,我很高興聽到關於配置選項的消息!當我們切換到更新的FFmpeg或Libav時,我會使用它。 – Nathan 2011-12-06 21:52:14

2

我在將libsctp構建到自定義構建環境時遇到了此錯誤。

符號版本控制被解釋爲here並且可以使用鏈接描述文件來控制它。在我來說,我是能夠通過向特定目標LDFLAGS的Makefile變量在現有版本的鏈接腳本拉:

$(LIB_PATH)/libsctp.so: LDFLAGS += \ 
    -Xlinker --version-script=$(MODULE_PATH)/src/lib/Versions.map