靜態庫和共享庫(動態庫)的區別
根據鏈結時期不同,分為靜態庫和共享庫,靜態庫是在程式編譯時鏈結的,共享庫是在程式執行時鏈結的。
庫是預先編譯好的方法的集合,命名一般為libxx.a(靜態庫)libxx.so(動態庫),庫檔案常存放的地點為/lib或/usr/lib,庫對應的標頭檔案一般存放在/usr/include中
add.c
int add(int a,int b)
max.cint max(int a,int b)
main.c#includeint add(int a,int b);
int max(int a,int b)
int main()
1、靜態庫的生成
兩種方法int add(int a,int b),int max(int a,int b)分別在兩個檔案add.c和max.c中存放,靜態庫的生成過程如下
1):將所有的.c檔案編譯成.o目標檔案
gcc -c add.c 生成add.o
gcc -c max.c 生成max.o
2) : 對生成的.o目標檔案打包生成靜態庫
ar crv libfoo.a add.o max.o 是庫的名字
ar:做庫的命令
c:建立庫
r:將方法新增到庫里
v:顯示過程,可以不要
3):使用靜態庫
gcc -o main main.c -l. -lfoo //這裡寫的foo是去掉前字尾後庫的名字
-l:指定路徑 .代表當前路徑
-l:指定庫名
2 、共享庫的生成
1)將所有的.c檔案編譯成.o目標檔案
gcc -c max.c
gcc -c add.c
2) 對生成的.o檔案處理生成共享庫,共享庫的名字為libfoo.so
gcc -shared -fpic -o libfoo.so add.o max.o
-shared 表示輸出結果是共享庫型別的
-fpic 表示使用位址無關**(position independent code)技術來生產輸出檔案
3)庫的使用
gcc -o main main.c -lfoo
cp libfoo.so /usr/lib
3、小結:
靜態庫包含了目標**即.o檔案,不利於磁碟,空間的使用,造成系統空間的浪費
共享庫由於在程式執行時鏈結,所以執行速度稍低
程式在鏈結時,一般優先鏈結共享庫,除非用static引數指定鏈結靜態庫
靜態庫和共享庫的區別
根據鏈結時期不同,庫分為靜態庫和動態庫。靜態庫是在程式編譯時鏈結的,動態庫是在程式執行時鏈結的。庫是預先編譯好的方法的集合 linux上庫的命名一般為lib a 靜態庫 lib so 動態庫 庫檔案常存放的地點為 lib或 usr lib,庫對應的標頭檔案一般存放在 usr include中 下面介...
靜態庫和動態庫的區別
windows vc 靜態庫 在編譯的時候載入生成目標檔案,在執行時不用載入庫,在執行時對庫沒有依賴性。動態庫 在目標檔案執行時載入,手動載入,且對庫有依賴性。兩者區別 一,靜態庫的使用需要 1 包含乙個對應的標頭檔案告知編譯器lib檔案裡面的具體內容 2 設定lib檔案允許編譯器去查詢已經編譯好的...
靜態庫和動態庫的區別
靜態庫在程式編譯時被連線到目標 中,程式執行時不再需要靜態庫 動態庫在編譯時並不被連線到目標 中,而是程式執行時才被載入,執行時仍然需要動態庫存在。靜態庫的命名規範是以 lib為字首,緊接著是靜態庫名,副檔名是.a 先將檔案編譯成 o 檔案然後是編譯成靜態檔案 動態庫檔案在檔名前加 lib字首,擴充...