2012-05-02 75 views
2

我已經建立了我lib.a文件與幾個未定義參考我自己的圖書館

gcc -c file.c -o file.o 

然後

ar sr lib/libtest.a file1.o file2.o file3.o 

ar -t lib/libtest.a 
file1.o 
file2.o 
file3.o 

證實,但是當我嘗試編譯測試應用

gcc lib/libtest.a test.c -o test 

我在功能main未定義參考:與圖書館 從file1.o,file2.o使用的功能,file3.o

+0

請參閱[GCC鏈接選項](http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html)。 – hmjd

回答

6

訂購事宜 - 嘗試:

gcc test.c -o test lib/libtest.a 

基本上,鏈接器讀取當它在輸入文件列表中遇到它時(這可能不是如何工作的,但我認爲它按照經驗法則很好),並且將解決任何尚未定義的引用剩餘。當它移動到下一個輸入時,它將不會再次查找該庫,以查找任何新的未解決的引用。 (注意:有一些鏈接器選項可以改變這種行爲,但它們似乎很少使用,可能有它們自己的缺點,所以我在這裏不討論它們,這種問題通常可以通過解決重新排序鏈接器的輸入文件列表)。

+1

+1。請注意,這只是靜態庫的一個問題,因爲ld會選擇歸檔文件中的哪些對象文件進行鏈接。有' - 整個檔案'這可能是你提到的那些奇特的選項之一,但又不常見也不理想(因爲你可能會連接一個潛在的大塊)。但是,如果將其包含在庫代碼本身中(即從多個.a's生成.so),這將非常有用。 –