1:靜態庫之間的連接關系:
要使用一個靜態庫,必須要有頭文件,就可以直接調用;如果一個靜態庫依賴另外一個靜態庫時,只要把兩個靜態庫放在一起,系統會自動鏈接;
例如:我們可以編譯一個靜態庫,使用,一個.h和一個cpp,一個靜態庫以及靜態庫的頭文件,就可以生成兩個靜態庫,最后發布版本的時候,只要一個.h文件和.a就可以了,不需要依賴庫的頭文件!
2:動態庫的使用依賴關系:
依賴的動態庫,必須存在,使用和靜態庫差不多,需要頭文件和動態庫,已經依賴的動態,不需要依賴庫的頭文件;
3:出現undefined reference to" 問題解決方法,這種問題比較隱蔽,也是我最近遇到的與網上大家討論的不同的問題,舉例說明如下,首先,還是看看測試代碼。當依賴多個庫的時候,要注意靜態庫的依賴順序。
從上圖可以看出,main.c調用了test.c的函數,test.c中又調用了fun.c的函數。
首先,我們先對fun.c,test.c,main.c進行編譯,生成 .o文件。
- gcc -c func.c
- gcc -c test.c
- gcc -c main.c
然后,將test.c和func.c各自打包成為靜態庫文件。
- ar –rc func.a func.o
- ar –rc test.a test.o
這時,我們准備將main.o鏈接為可執行程序,由於我們的main.c中包含了對test()的調用,因此,應該在鏈接時將test.a作為我們的庫文件,鏈接命令如下。
- gcc -o main main.o test.a
這時,編譯器仍然會報錯,如下:
- test.a(test.o): In function `test':
- test.c:(.text+0x13): undefined reference to `func'
- collect2: ld returned 1 exit status
就是說,鏈接的時候,發現我們的test.a調用了func()函數,找不到對應的實現。由此我們發現,原來我們還需要將test.a所引用到的庫文件也加進來才能成功鏈接,因此命令如下。
- gcc -o main main.o test.a func.a
ok,這樣就可以成功得到最終的程序了。同樣,如果我們的庫或者程序中引用了第三方庫(如pthread.a)則同樣在鏈接的時候需要給出第三方庫的路徑和庫文件,否則就會得到undefined reference的錯誤。
轉自:https://blog.csdn.net/wfei101/article/details/74502845