1 靜態庫概述
C語言靜態庫(Static Library)是一種包含一組目標文件的歸檔文件,這些目標文件通常是由多個C語言源文件編譯而成的。靜態庫在程序編譯時被鏈接到目標程序中,成為程序的一部分,因此在運行時不再需要額外的庫文件。與動態庫(Dynamic Library)不同,靜態庫在編譯時就已經被完全嵌入到可執行文件中,因此生成的可執行文件通常較大,但無需在運行時依賴外部庫文件。
靜態庫通常具有.a
的文件擴展名(代表archive),而在Windows中則通常使用.lib
擴展名。創建靜態庫的過程涉及將多個目標文件(通常由.o
或.obj
文件組成)打包成一個單獨的庫文件。
使用靜態庫的好處之一是,它使得程序在分發時更加簡單,因為所有必要的代碼都已經包含在可執行文件中。此外,由于靜態鏈接在編譯時就已經完成,因此可以避免運行時動態鏈接可能帶來的版本兼容性問題。然而,靜態庫也有一些缺點,比如生成的可執行文件較大,以及如果多個程序使用相同的靜態庫,那么每個程序都會包含庫的一份完整副本,導致磁盤空間的浪費。
2 靜態庫制作
例如,實現一個簡單的數學運算MathFun.c
// 靜態庫中的函數,用于加法
int add(int a, int b)
{ return a + b;
} // 靜態庫中的函數,用于減法
int subtract(int a, int b)
{ return a - b;
}
-
通過gcc -c編譯源代碼,生成目標文件.o
-
通過ar rc(或rcs)將目標文件.o打包生成靜態庫.a文件
gcc -c MathFun.c -o MathFun.o
ar rc libMathFun.a MathFun.o
注意,庫文件需要以lib開頭,例如上述數學庫,libMathFun.a;如果不帶lib的話,將庫文件鏈接至可執行文件時,可能會引起編譯錯誤,如下:
# mathfunc.a放在dynamicdemo/lib目錄下
whccf@whccf-VirtualBox:~/code/staticdemo$ gcc -o calculator calculator.c -L /home/whccf/code/staticdemo/lib -lmathfunc
/usr/bin/ld: 找不到 -lmathfunc
collect2: error: ld returned 1 exit status# 解決方案
# 將dynamicdemo/lib下的mathfunc.a重新命名為libmathfunc.a,然后,再次使用gcc命令重新編譯即可。
3 靜態庫使用
主程序calculator.c
,它使用靜態庫中的函數
#include <stdio.h>
#include "MathFun.h" int main()
{ int a = 5; int b = 3; int sum = add(a, b); int diff = subtract(a, b); printf("Sum: %d\n", sum); printf("Difference: %d\n", diff); return 0;
}
為了編譯這個程序并鏈接靜態庫,需要使用以下命令:
gcc -o calculator calculator.c -L /home/whccf/code/staticdemo/lib/ -lMathFun
其中,
-
-L.
告訴編譯器在當前目錄下查找庫文件 -
-lMathFun
則告訴編譯器鏈接名為libMathFun.a
的庫,注意不需要提供.a
后綴