靜態庫之間的連接關系


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文件。

 
        
  1. gcc -c func.c  
  2. gcc -c test.c  
  3. gcc -c main.c 

    然后,將test.c和func.c各自打包成為靜態庫文件。

 
        
  1. ar –rc func.a func.o  
  2. ar –rc test.a test.o 

    這時,我們准備將main.o鏈接為可執行程序,由於我們的main.c中包含了對test()的調用,因此,應該在鏈接時將test.a作為我們的庫文件,鏈接命令如下。

 
        
  1. gcc -o main main.o test.a 

    這時,編譯器仍然會報錯,如下:

 
        
  1. test.a(test.o): In function `test':  
  2. test.c:(.text+0x13): undefined reference to `func'  
  3. collect2: ld returned 1 exit status 

    就是說,鏈接的時候,發現我們的test.a調用了func()函數,找不到對應的實現。由此我們發現,原來我們還需要將test.a所引用到的庫文件也加進來才能成功鏈接,因此命令如下。

 
        
  1. gcc -o main main.o test.a func.a 

    ok,這樣就可以成功得到最終的程序了。同樣,如果我們的庫或者程序中引用了第三方庫(如pthread.a)則同樣在鏈接的時候需要給出第三方庫的路徑和庫文件,否則就會得到undefined reference的錯誤。

轉自:https://blog.csdn.net/wfei101/article/details/74502845


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM