2012-08-03 93 views
1

我有一個C項目,它使用多個需要按特定順序鏈接的對象文件來查找所有需要的符號。靜態庫中對象的順序

例如該命令工作正常(lib2.o取決於lib1.o等)

gcc -o my_app main.o lib1.o lib2.o lib3.o -lm 

gcc -o my_app main.o lib3.o lib2.o lib1.o -lm 

具有未定義的參考`my_variable」錯誤結束。

這是一個已知的行爲,可以通過將這些對象添加到鏈接描述文件中的GROUP部分來解決。

現在我想與我的同事分享這些靜態庫。所以...

ar -rcs mylib.a lib1.o lib2.o lib3.o 
gcc -o my_app main.o mylib.a -lm 

不幸的是,這給出了相同的未定義參考錯誤,如指定不正確的順序對象。

我還沒有找到任何鏈接器或存檔器選項,使其工作,也沒有解決方法,即使我認爲這個問題應該是相對普遍的谷歌搜索。

請問任何人都知道解決方案嗎?

問候 月

+0

您能顯示'nm -s mylib.a'的輸出嗎 – askmish 2012-08-03 11:07:46

回答

0

你的錯誤意味着這個問題是在你的lib之一?.o文件[LIB {}後面的.o取決於LIB {}較早的.o]
你是怎樣設法編譯它們?
是否有編譯警告?
自從我使用C以來已經有一段時間了,但我認爲您需要將依賴庫包含在具有依賴關係的庫中 - 這可能是您找不到太多對該問題的引用的原因,因爲它並不存在。

+0

您好, 不幸的是,我沒有庫的來源,因爲它們僅由我們的供應商以二進制形式提供。通過以正確的順序指定每個對象文件來編譯項目沒有問題,但我想將它們收集到一個靜態庫,因爲一個文件比二十個文件更容易維護... – Honza 2012-08-03 10:22:37

+1

嘗試http://stackoverflow.com/問題/ 2980102/combine-two-gcc-compiled-o-object-files-into-a-third-o-file和https://www.google.co.uk/search?q=gcc+combine+multiple+ lib + into + one – 2012-08-03 10:30:29

2

這可能是鏈接順序問題。當GNU鏈接器看到一個庫時,它會丟棄它不需要的所有符號。它也是按順序從左到右的順序。

最近版本的gcc/ld默認與--as-needed標誌鏈接。

這意味着,如果你的C文件

你可以解決這個問題(如果是「被需要」像這樣的事情在測試時的順序事項)磁帶庫會自動得到排除之前寫-lmylib.a之一:

  1. gcc -L. -o example example.c -lmylib.a
  2. gcc -L. -Wl,--no-as-needed -o example example.c -lmylib.a

其中通過後者鏈接器,這將導致庫仍然被鏈接,即使你沒有從它外部調用任何函數。

+0

嗨,我幾乎可以肯定,這是一個鏈接順序問題,但這並不能解決它在我的情況。問題是mylib.a中存檔的obj文件依賴於同一個庫中的另一個obj文件。我知道幾個庫之間的循環依賴問題解決了--start-group選項,但事實並非如此,因爲庫只有一個... – Honza 2012-08-03 10:54:17

+0

嘗試使用'ranlib'歸檔文件而不是'ar'。 – askmish 2012-08-03 11:01:00

+0

我已經試過了。另外-s參數爲ar應該做同樣的事情,但沒有成功再次:( – Honza 2012-08-03 11:30:40