一般情況下,在專案裡會把功能相似的**封裝成庫,方便使用和管理,同時增加了**的內聚性。
庫分為兩種,一種為靜態庫,檔名以.a結尾,另一種是動態庫,檔名以.so結尾。靜態庫和動態庫的使用各有利弊。
靜態庫的特點:
動態庫的特點:
現在用乙個微型的工程,來講述靜態庫、動態庫的生成和使用。假設有3個.c檔案,分別為:add.c sub.c main.c,實現了add()和sub()這兩個函式,功能是返回兩個整數相加或者相減的結果,main.c中使用到了這兩個函式。下面講述怎樣把這add.c和sub.c兩個檔案生成並使用靜態庫和動態庫,然後生成可執行檔案。
int add(int a, int b);
int add(int a, int b)
int sub(int a, int b);
int sub(int a, int b)
#include "add.h"
#include "sub.h"
#include int main()
1. 生成靜態庫
生成靜態庫一般使用ar命令,語法為:
ar archivefile.a objfile.o
# archivefile.a 靜態庫的名稱
# objfile.o是目標檔名,可以多個並列
引數
引數意義
-r將objfile檔案插入靜態庫尾或者替換靜態庫中同名檔案
-x從靜態庫檔案中抽取檔案objfile
-t列印靜態庫的成員檔案列表
-d從靜態庫中刪除檔案objfile
-s重置靜態庫檔案索引
-v建立檔案冗餘資訊
-c建立靜態庫檔案
通常步驟是把生成靜態庫所涉及到的.c檔案全都編譯,生成.o檔案,然後使用ar命令生成.a檔案,即靜態庫。這裡需要使用到gcc的-c選項,意思是只進行編譯,不進行鏈結。
gcc -w -c add.c -o add.o
gcc -w -c sub.c -o sub.o
ar cvr libaddsub.a add.o sub.o
此時得到了靜態庫libaddsub.a。可以用命令nm來檢視.a中的符號名稱。
2. 使用靜態庫
使用靜態庫的方法非常簡單,直接把靜態庫的名字加入到需要編譯的檔案裡就可以。如下所示,注意被依賴的靜態庫應該放在後面:
gcc -w -c main.c -o main.o
gcc main.o libaddsub.a -o test
執行test得到如下結果:
result of 1 + 1 is: 2
result of 6 - 3 is: 3
3. 生成動態庫
生成動態庫要求編譯出的.o檔案是位置無關的**,也就是說需要使用-fpic選項。然後使用gcc的-shared選項生成動態庫。
gcc -w -c add.c -fpic -o add.o
gcc -w -c sub.c -fpic -o sub.o
gcc -shared add.o sub.o -o libaddsub.so
4. 使用動態庫
生成可執行檔案的時候需要指定動態庫所在的位置,以及動態庫的名稱。-l選項表示指定動態庫所在的目錄,-l選項表示需要鏈結的動態庫的名稱。一般linux下動態庫的明明規則都是lib***.so,其中***為動態庫的真正名稱,所以-l選項的寫法是-l***。-l選項與它後的內容以及-l選項與它後面的內容之間可以沒有空格,也可以加上空格。也就是說,-l***和-l ***都是可以的。
gcc -w -c main.c -o main.o
gcc main.o -o test -l./ -laddsub
如果此時直接執行test的話,會得到類似下面的錯誤:
./test: error while loading shared libraries: libaddsub.so: cannot open shared object file: no such file or directory
意思是libaddsub.so不在系統預設載入動態庫的目錄裡面。解決的辦法有很多種:
ld_library_path=$ld_library_path:pwd ./test
這只是乙個臨時的做法,不建議使用這個方法。
gcc main.o -o test -l./ -laddsub -wl,-rpath=./
./test
執行程式後,還是可以得到和使用靜態庫相同的結果。
參考:
linux下檢視動態庫和靜態庫
靜態庫用ar t yourfile 動態庫用 nm d yourfile 下面是ar和nm命令的一些引數說明 1.ar基本用法 ar命令可以用來建立 修改庫,也可以從庫中提出單個模組。庫是一單獨的檔案,裡面包含了按照特定的結構組織起來的其它的一些檔案 稱做此庫檔案的member 原始檔案的內容 模式...
Linux下的動態庫和靜態庫
靜態庫 程式編譯時載入,可執行程式體積大。一般命名為lib x.a。動態庫 程式執行時載入,可執行程式體積小。一般命名為lib x.so.1.3。x一般指庫名,如libxml2 tinyxml等 動態庫一般預設安裝在 lib 或者 usr lib 或者 usr local lib下。如果安裝的庫不在...
linux下的動態庫和靜態庫
1 使用gcc建立和使用靜態庫 1 gcc o mylib.o c mylib.c 生成o檔案 2 ar rcs libmylib.a mylib.o 生成a檔案 c create的意思 r replace的意思,表示當插入的模組名已經在庫中存在,則替換同名的模組。3 cp libmylib.a u...