如何編譯靜態庫及將多個.a靜態庫合併成一個.a靜態庫
所使用的命令為ar
1 將所有的.a庫解壓成.o檔案
ar x xx.a
2 將所有的.o 檔案合併成.a
ar rcs xx.b *.o
3 編譯.a 靜態庫
1)生成對應的.o 檔案 gcc -c a.c b.c
2)使用ar命令合成靜態庫 ar crs libjson.a *.o
3) 檢視編譯庫使用的gcc 版本: strings libjson.a |grep GCC
4) 呼叫方法: gcc main.c -o main libjson.a --------------------- 本文來自 亦軒 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/wang112031/article/details/50054651?utm_source=copy
==================================================================
靜態庫編譯連線例項
1、目的:
A原始碼在進行功能實現的時候,需要用到獨立的B原始碼的介面和功能。那麼此時可以將B原始碼編譯成指定的lib庫的方式,這裡指的的 xxx.a的方式,而不是xxx.so的方式。那麼在A呼叫B介面的時候,直接在編譯選項中增加 -L引數指定需要的庫.a檔案即可。那麼在A中就能直接通過包含的B的標頭檔案對B中的函式進行呼叫了。
2、例項
B有兩個檔案,一個提供列印,一個提供add功能
print.c //提供列印函式
print.h //提供列印介面
add.c //提供add函式
add.h //提供add介面
2.1編譯
將以上兩個檔案編譯成libmylib.a
gcc -c add.c print.c //編譯生成add.o和print.o
ar crv libmylib.a add.o print.o //編譯生成libmylib.a靜態庫檔案
2.1編譯main函式
main檔案資訊
編譯:gcc main.c -L../lib_file/ -lmylib //意思就是在當前目錄上一層目錄lib_file下找libmylib.a檔案進行連結
這樣當生存的a.out可執行檔案的列印函式和add函式就是呼叫的靜態庫中的函式
--------------------- 本文來自 張翼_XZY 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/weixin_37871174/article/details/78394792?utm_source=copy
==========================================================================
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檔案,裡面程式碼如下:
- #include "stdio.h"
- int main()
- {
- printf("test !!!!!\n");
- return 0;
- }
-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
現在說本文的重點,合併靜態庫。
有關製作靜態庫命令可以參考
而靜態庫的使用,百度一下。
注意連結文章說的,靜態庫的模組是.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複製出來就可以了