1. 程式人生 > >如何編譯靜態庫及將多個.a靜態庫合併成一個.a靜態庫

如何編譯靜態庫及將多個.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檔案,裡面程式碼如下:

  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複製出來就可以了