2011-05-02 80 views
2

我一直在尋找一種解決方案來解決我的問題,並獲得一些線索,但我找不到任何一致的解決方案: 我有一個動態庫代碼(libdyna.so ),它使用3個靜態庫(libone.a,libtwo.a,libthree.a)和log4cpp庫的功能。 當我建造它的第一次一切似乎都很正常,我可以使「libdyna.so」,但是當y與我的Java測試程序測試它雖然包裝(JNI封裝正常工作)我得到了很多未定義的引用。動態庫使用靜態庫,出現未定義的符號

然後,我把「-z DEFS」標誌到make文件和大量未定義的引用的出現,我不能重新編譯的動態庫。

我做了「納米」命令與三個靜態庫,並將其導出所有我在DYNA LIB正確使用的功能。但是當我在包含3個靜態庫的'libdyna.so'上創建nm時,我發現了未定義的符號(函數)。

我認爲解決方案必須像添加一些標誌鏈接時,我想提出的動態,但我真的不知道。 任何人都可以幫助我,或者告訴我一些想法?如果需要一些代碼,請讓我知道,我會粘貼在這裏。 非常感謝。

P/d:對不起,我的英語不好。

+0

天啊。我不敢相信你不包括未解決符號的名字!你能找到一個時刻來添加這些嗎?大多數情況下,如果符號已知,這是一個三秒的答案。 – sehe 2011-05-02 18:25:18

+0

您是否還嘗試添加靜態庫?就像,-l/path/libtwo.a和其他兩個類似... – 2011-05-02 18:39:16

回答

3

你可以使用鏈接器選項--whole-archive,它將包括整個靜態庫和可能會解決您的問題,雖然圖書館可以成爲相當大。

g++ -shared -o libdyna.so dyna.o -Wl,-whole-archive -la -lb -lc -Wl,-no-whole-archive 

man ld:

對於--whole存檔選項後,在命令行中提到的每個存檔,包括在 鏈接在歸檔中每個對象文件,而不是搜索的歸檔需要的對象文件。這通常用於將歸檔文件轉換爲共享庫,強制每個對象都包含在生成的共享庫中。

別忘記關閉-Wl,-no-whole-archive

檢查gcc命令行中庫的出現順序,確保它們在動態庫的目標文件之後,否則鏈接器將不加載它們。例如,如果libone使用libtwo,則在libtwo之前出現libone也很重要。它可能是您的問題的替代解決方案。

相關問題