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

2021-10-12 01:49:51 字數 1571 閱讀 7604

靜態庫是指在我們的應用中,有一些公共**是需要反覆使用,就把這些**編譯為「庫」檔案;在鏈結步驟中,聯結器將從庫檔案取得所需的**,複製到生成的可執行檔案中的這種庫。

靜態庫

在程式開發工作中,經常會遇到我們的程式需要鏈結外部庫的做法。

比如想要在我們的c工程中呼叫sqlite資料庫的相關介面進行資料庫操作,那麼我們首先需要做的事情是獲取sqlite的原始碼,然後將sqlite原始碼編譯成靜態庫libsqlite.a,最終我們在程式中包含sqlite的標頭檔案並呼叫相關介面,並且在編譯的時候鏈結libsqlite.a靜態庫。

最終生成的可執行檔案就會包含我們自己寫的程式和sqlite資料庫功能。

靜態庫可以理解成程式的集合,包含了常用的公共**部分(glibc)或者實現了專用的功能(sqlite)。這樣我們在編寫程式時就不需要重複實現相關的功能,直接包含標頭檔案並連線需要的庫即可。大大減少了我們編碼的工作量。

靜態庫的製作

本節看一下如何製作乙個靜態庫。

這裡我們實現乙個公共的加法操作函式tadd(int a, int b);首先實現tadd()函式及其標頭檔案tadd.h:

// tadd.cint tadd(int a, int b)
// tadd.h#ifndef __tadd_h__#define __tadd_h__int tadd(int a, int b);#endif
將tadd.c編譯為目標檔案:

$ gcc -c tadd.c -o tadd.o
這裡只是將tadd.c編譯為tadd.o,gcc 的 -c 選項指的是對於原始檔只編譯但是不進行連線。所以tadd.o只是乙個編譯好的二進位制目標檔案,並不是鏈結好的可執行檔案。

接下來我們將會使用這個編譯好的目標檔案,將該檔案打包為靜態庫。

$ ar rcs libtadd.a tadd.o
ar工具可以將目標檔案打包成靜態庫,ar打包之後的檔案就可以在程式中進行鏈結使用。

測試

現在我們寫乙個測試**對剛才生產的靜態庫進行測試:

// prog.c#include #include "tadd.h"int main()
編譯方法:

$ gcc prog.c -o prog -l./ -ltadd
prog.c是測試的c檔案,會在該檔案中呼叫tadd()函式,-l引數表示需要鏈結的靜態庫檔案的路徑,-ltadd引數表示需要鏈結libtadd.a靜態庫。

這裡我們把libtadd.a和tadd.h兩個檔案放在和prog.c的同級目錄。

執行結果:

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

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

C語言庫 靜態庫 共享庫

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

C語言庫 靜態庫 共享庫

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