C語言的本質(34)——靜態庫
庫是一種軟體元件技術,庫裡面封裝了資料和函式。
庫的使用可以使程式模組化。
Windows系統包括靜態連結庫(.lib檔案)和動態連結庫(.dll檔案)。
Linux通常把庫檔案存放在/usr/lib或/lib目錄下。
Linux庫檔名由:字首lib、庫名和字尾3部分組成,其中動態連結庫以.so最為字尾,靜態連結庫通常以.a作為字尾。
在程式中使用使用靜態庫和動態庫時,他們載入的順序是不同的。
靜態庫的程式碼在編譯時就拷貝的應用程式中,這樣的優點是節省編譯時間。
動態連結庫時程式在開始執行後呼叫庫函式時才被載入。
靜態庫,也稱為歸檔檔案(archive),按照慣例它們的名字都以 .a 結尾。比如,標準C語言函式庫 /usr/lib/libc.a 和 X11 函式庫 /usr/x11/lib/libx11.a .
我們可以容易地建立和維護自已的靜態庫,只要使用 ar 程式和 gcc -c命令對函式進行分別編譯就可以了。
靜態庫的建立和使用:
1、在一個標頭檔案種宣告靜態庫所匯出的函式。
2、在一個原始檔種實現靜態庫所匯出的函式。
3、編譯原始檔,生成可執行程式碼。
4、將可執行程式碼所在的目標檔案加入到某個靜態庫中,並將靜態庫拷貝到系統預設的存放庫檔案的目錄下。
下面通過一個例子來說明:mylib.h種存放的是靜態庫提供給使用者使用的函式的宣告,mylib.c實現了mylib.h種宣告的函式。
/*mylib.h*/
#ifndef _MYLIB_H_
#define _MYLIB_H_
void weclome(void);
void outString(const char *str);
#endif
/*mylib.c*/
#include "mylib.h"
#include
void welcome(void)
{
printf("welcome to libmylib\n");
}
void outString(const char *str)
{
if(str != NULL)
printf("%s\n", str);
}
1、編譯mylib.c:產生要包含在庫檔案中的目標。這通過呼叫帶有 -c 選項的 C 語言編譯器來實現。-c 選項的作用是阻止編譯器建立一個完整的程式。
gcc -o mylib.o -c mylib.c
2、將目標檔案加入到靜態庫中:建立並使用一個庫檔案。 我們用 ar 程式建立一個歸檔檔案並將目標檔案新增進去。這個程式之所以稱為 ar,是因為它將若干個單獨的文件歸併到一個大的檔案中以建立歸檔文件或集合。注意,我們也可以用 ar 程式來建立任何型別檔案的歸檔檔案 (請注意,ar 只是一個通用工具.)
ar rcs libmylib.a mylib.o
3、將靜態庫copy到Linux的庫目錄(/usr/lib或者/lib)下:
cp libmylib.a /usr/lib/libmylib.a
編寫呼叫庫函式的測試程式test.c:
#include "mylib.h"
#include
int main(void)
{
printf("create and use library:\n");
welcome();
outString("it's successful\n");
return 0;
}
4、使用靜態庫編譯:
gcc -o testtest.c -l mylib
這裡注意,編譯時無需帶上字首和字尾。
5、執行可執行程式
test: ./test
create and use library:
welcome to libmylib
it's successful
在Linxu下,可以使用ar命令來建立和修改靜態庫。
這些在linux下man ar一下就可以得到引數,這裡說明幾個常用的
d:從庫中刪除成員檔案。
r:在庫中加入成員檔案,若存在,則替換。
c:建立一個庫。
s:無論ar命令是否修改了庫內容,都強制重新生成庫符號表。
其他的命令可是使用man檢視。
相關文章
- C語言的本質(35)——共享庫C語言
- C語言的本質(22)——C標準庫之字串操作C語言字串
- 深入理解C語言----動態庫 & 靜態庫 & 連結C語言
- C語言編寫靜態連結庫及其使用C語言
- C語言的本質(36)——makefile基礎C語言
- C語言的本質(32)——C語言與彙編之C語言內聯彙編C語言
- C語言的本質(26)——C標準庫之數值字串轉換C語言字串
- C語言的本質(38)——makefile之變數C語言變數
- C語言的本質(24)——C標準庫之輸入與輸出(下)C語言
- C語言--靜態區域性變數C語言變數
- C語言動態呼叫庫(轉)C語言
- C語言多維陣列本質技術推演C語言陣列
- Go語言slice的本質-SliceHeaderGoHeader
- Scala: 感覺像動態的靜態語言
- C語言的本質(19)——預處理之一:巨集定義C語言
- 程式語言:型別系統的本質型別
- C靜態庫的建立與使用--為什麼要引入靜態庫?
- 聊聊C語言和指標的本質C語言指標
- 理解函數語言程式設計的本質函數程式設計
- C語言的本質(37)——makefile之隱含規則和模式規則C語言模式
- C++除法運算 // 靜態斷言C++
- 計算機語言:編譯型/解釋型、動態語言/靜態語言、強型別語言/弱型別語言計算機編譯型別
- Linux 依賴動態庫 / 靜態庫的動態態庫 / 靜態庫Linux
- 澄清Java語言介面與繼承的本質(轉)Java繼承
- C++靜態庫與動態庫深入研究C++
- Go語言實現靜態伺服器Go伺服器
- C 語言實現使用靜態陣列實現迴圈佇列陣列佇列
- C語言函式手冊:c語言庫函式大全|C語言標準函式庫|c語言常用函式查詢C語言函式
- 創業,你選擇靜態還是動態語言?創業
- C語言區域性變數、全域性變數、靜態區域性變數、靜態全域性變數C語言變數
- - C語言標準庫C語言
- NLP需要回歸語言本質,走向語義和計算的融合
- 什麼是靜態語言和動態語言。史上秒懂的大白話翻譯。
- C語言的本質(21)——預處理之三:其它預處理特性及總結C語言
- 概念區別 【編譯型語言與解釋型語言、動態型別語言與靜態型別語言、強型別語言與弱型別語言】編譯型別
- C語言動態走迷宮C語言
- tmpnam() - C語言庫函式C語言函式
- tmpfile() - C語言庫函式C語言函式