鏈結使用靜態庫
靜態庫的本質就是將多個目標檔案打包成乙個庫檔案。鏈結靜態庫就是將庫中被呼叫**複製到可執行檔案中。使用了靜態庫的可執行檔案占用磁碟空間和內容空間都比較大,靜態庫中**被修改後,需重新生成庫檔案並需重新鏈結庫檔案。使用靜態庫的可執行檔案無需依賴靜態庫,靜態庫即使被刪除,也可照常執行。執行效率比動態庫相對要高。
靜態庫的檔案形式為:lib《庫名》.a
**實現
假如我們制定乙個數學操作的靜態庫,在同乙個資料夾下,有如下檔案:
– add.c
– add.h
– sub.c
– sub.h
add.c為加法操作實現,sub.c為減法操作實現。
**如下:
add.h
#ifndef c_add_h
#define c_add_h
int add(int a, int b);
#endif //c_add_h
add.c
#include "add.h"
int add(int a, int b)
sub.h
#ifndef c_sub_h
#define c_sub_h
int sub(int a, int b);
#endif //c_sub_h
sub.c
#include "sub.h"
int sub(int a, int b)
建立靜態庫
首先我們將源**編譯為目標檔案:
gcc -c add.c sub.c
執行完畢後會生產add.o和sub.o檔案。
靜態庫建立使用ar
命令;
ar -r libmymath.a add.o sub.o
執行完後,會建立乙個libmymath.a檔案。
我們為了使用上面的靜態庫,我們在如上相同資料夾下,建立乙個main.c檔案:
– add.c # 加法實現
– add.h # 加法標頭檔案
– sub.c # 減法實現
– sub.h # 減法標頭檔案
– libmymath.a # 靜態庫檔案
– main.c # 入口主程式
main.c
#include #include "add.h"
#include "sub.h"
int main(void)
我們使用#include預處理指令包含了sub.h和add.h標頭檔案,來使用我們製作的mymath靜態庫。
如果我們直接gcc -o main main.c
肯定會出錯,因為編譯器不知道add.h和sub.h是**來的,也不知道add和sub函式的定義在**。
所以我們需要使用-l
選項,讓編譯器鏈結到我們製作的靜態庫:
gcc main.c libmymath.a -o main
執行得到如下:
20+10=30
20-10=10
靜態庫如果被刪除,不會影響可執行檔案的執行。因為靜態庫的**被複製到了可執行檔案中,作為了可執行檔案的一部分,這也是靜態庫和動態庫的部分區別所在。
至此,從靜態庫的製作到鏈結使用就結束了。
c 生成靜態庫 C語言靜態庫的製作與使用
靜態庫是指在我們的應用中,有一些公共 是需要反覆使用,就把這些 編譯為 庫 檔案 在鏈結步驟中,聯結器將從庫檔案取得所需的 複製到生成的可執行檔案中的這種庫。靜態庫 在程式開發工作中,經常會遇到我們的程式需要鏈結外部庫的做法。比如想要在我們的c工程中呼叫sqlite資料庫的相關介面進行資料庫操作,那...
C語言庫 靜態庫 共享庫
我們在編寫乙個c語言程式的時候,經常會遇到好多重複或常用的部分,如果每次都重新編寫固然是可以的,不過那樣會大大降低工作效率,並且影響 的可讀性,更不利於後期的 維護。我們可以把他們製作成相應的功能函式,使用時直接呼叫就會很方便,還可以進行後期的功能公升級。例如我要在一段 中多次交換兩個變數的值,我可...
C語言庫 靜態庫 共享庫
我們在編寫乙個c語言程式的時候,經常會遇到好多重複或常用的部分,如果每次都重新編寫固然是可以的,不過那樣會大大降低工作效率,並且影響 的 可讀性,更不利於後期的 維護。我們可以把他們製作成相應的功能函式,使用時直接呼叫就會很方便,還可以進行後期的功能公升級。例如我要在一段 中多次交換兩個變數的值,我...