庫是一種軟件組件技術,庫里面封裝了數據和函數。
庫的使用可以使程序模塊化。
Windows系統包括靜態鏈接庫(.lib文件)和動態鏈接庫(.dll文件)。
Linux通常把庫文件存放在/usr/lib或/lib目錄下。
Linux庫文件名由:前綴lib、庫名和后綴3部分組成,其中動態鏈接庫以.so最為后綴,靜態鏈接庫通常以.a作為后綴。
在程序中使用使用靜態庫和動態庫時,他們載入的順序是不同的。
靜態庫的代碼在編譯時就拷貝的應用程序中,這樣的優點是節省編譯時間。
動態鏈接庫時程序在開始運行后調用庫函數時才被載入。
靜態庫的創建和使用:
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生成目標文件:gcc -o mylib.o -c mylib.c
2>將目標文件加入到靜態庫中: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 test test.c -lmylib
這里注意,編譯時無需帶上前綴和后綴。
5>運行可執行程序test: ./test
create and use library: welcome to libmylib it's successful
在Linxu下,可以使用ar命令來創建和修改靜態庫。
這些在linux下man ar一下就可以得到參數,這里說明幾個常用的
d:從庫中刪除成員文件。
r:在庫中加入成員文件,若存在,則替換。
c:創建一個庫。
s:無論ar命令是否修改了庫內容,都強制重新生成庫符號表。
其他的命令用時再man。
上面這五步是基本的使用,還有需要的話,就要深入的學習了。