linux靜態庫的生成與使用(轉)

鴨脖發表於2013-06-08

庫是一種軟體元件技術,庫裡面封裝了資料和函式。

庫的使用可以使程式模組化。
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。

上面這五步是基本的使用,還有需要的話,就要深入的學習了。

相關文章