C語言 靜態庫製作(親測可行)

2021-10-18 02:31:04 字數 1885 閱讀 5626

鏈結使用靜態庫

靜態庫的本質就是將多個目標檔案打包成乙個庫檔案。鏈結靜態庫就是將庫中被呼叫**複製到可執行檔案中。使用了靜態庫的可執行檔案占用磁碟空間和內容空間都比較大,靜態庫中**被修改後,需重新生成庫檔案並需重新鏈結庫檔案。使用靜態庫的可執行檔案無需依賴靜態庫,靜態庫即使被刪除,也可照常執行。執行效率比動態庫相對要高。

靜態庫的檔案形式為: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

此時在當前目錄生成了main的可執行檔案。

執行得到如下:

20+10=30

20-10=10

靜態庫如果被刪除,不會影響可執行檔案的執行。因為靜態庫的**被複製到了可執行檔案中,作為了可執行檔案的一部分,這也是靜態庫和動態庫的部分區別所在。

至此,從靜態庫的製作到鏈結使用就結束了。

c 生成靜態庫 C語言靜態庫的製作與使用

靜態庫是指在我們的應用中,有一些公共 是需要反覆使用,就把這些 編譯為 庫 檔案 在鏈結步驟中,聯結器將從庫檔案取得所需的 複製到生成的可執行檔案中的這種庫。靜態庫 在程式開發工作中,經常會遇到我們的程式需要鏈結外部庫的做法。比如想要在我們的c工程中呼叫sqlite資料庫的相關介面進行資料庫操作,那...

C語言庫 靜態庫 共享庫

我們在編寫乙個c語言程式的時候,經常會遇到好多重複或常用的部分,如果每次都重新編寫固然是可以的,不過那樣會大大降低工作效率,並且影響 的可讀性,更不利於後期的 維護。我們可以把他們製作成相應的功能函式,使用時直接呼叫就會很方便,還可以進行後期的功能公升級。例如我要在一段 中多次交換兩個變數的值,我可...

C語言庫 靜態庫 共享庫

我們在編寫乙個c語言程式的時候,經常會遇到好多重複或常用的部分,如果每次都重新編寫固然是可以的,不過那樣會大大降低工作效率,並且影響 的 可讀性,更不利於後期的 維護。我們可以把他們製作成相應的功能函式,使用時直接呼叫就會很方便,還可以進行後期的功能公升級。例如我要在一段 中多次交換兩個變數的值,我...