linux編程合並多個靜態庫.a為一個.a


.a 文件的結構和.tar文件就沒有什么區別。 x 命令解出來, a 命令添加, t命令列表
假設A.a, B.a C.a 在/usr/local/lib目錄下
mkdir /tmp/libABC
cd /tmp/libABC
ar x /usr/local/lib/A.a
ar x /usr/local/lib/B.a
ar x /usr/local/lib/C.a
ar cru libABC.a *.o
ranlib libABC.a

1、gcc入門

(1)gcc即是linux下c/c++的編譯器。

gcc經常用的的選項有-c,-o。

 

-c表示只編譯(compile)源文件但不鏈接,會把.c或.cc的c源程序編譯成目標文件(二進制文件),一般是.o文件。

-o用於指定輸出(out)文件名。不用-o的話,一般會在當前文件夾下生成默認的a.out文件作為可執行程序。

 

我們在任意位置新建一個test文件夾,方便我們寫測試文件。

現在我們新建一個test.cpp文件,里面代碼如下:

  1. #include "stdio.h"  
  2. int main()  
  3. {  
  4.     printf("test  !!!!!\n");  
  5.     return 0;  
  6. }  

 

-c選項:

gcc -c test.cpp

生成二進制test.o文件,.o文件是一個中間文件 ,可制作成庫文件,也可以生成可執行文件。

-o選項:

gcc test.cpp -o test

  或者,利用剛剛生成的test.o文件:gcc test.o -o test

即可生成test可執行文件。

如果命令為:

gcc test.cpp 或 gcc test.o

即像上文所說的生成a.out可執行文件。

 

 

2、合並靜態庫

制作靜態庫

ar rc libtest.a test.o

現在說本文的重點,合並靜態庫。

有關制作靜態庫命令可以參考

linux ar命令

而靜態庫的使用,百度一下。

注意鏈接文章說的,靜態庫的模塊是.o文件。

之前我一直想把一個靜態庫包含到另一個靜態庫里,比如:ar rc liball.a libtest1.a libtest2.a

即把libtest1.a和libtest2.a包含到liball.a里面,這句話是沒問題!

但是這種思路是錯的!!!!!

如果當你想要用到libtest1.a或libtest2.a里的函數里,是找不到的!!!

因為liball.a里包含的是libtest1.a和libtest2.a,而gcc找的里.o文件,.o文件里才包含我們寫好的方法

所以我們應該這樣來寫:

制作一個臨時文件夾,比如在我們的test文件夾下新建temp文件夾,把從各個.a庫導出的.o文件都放到這個文件夾里,再把所以.o文件打成.a庫。

命令如下:

cd temp

ar x libtest1.a

ar x libtest2.a

ar rc liball.a *.o

再把liball.a復制出來就可以了。


免責聲明!

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



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