Linux靜態庫的生成和使用

2021-07-26 01:09:55 字數 1759 閱讀 3327

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

庫的使用可以使程式模組化。

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)

void outstring(const char *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)

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。

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

批註:1.方法一是拷貝libmylib.a到/usr/lib中,直接編譯;

2.方法二是指定路徑編譯gcc main.c -l. -lmylib//.指的是當前目錄

Linux靜態庫 動態庫的生成和使用

當要把程式給別人,但不想讓他看到原 的時候,可以將程式編譯成 庫 發給他。相當於對程式進行了加密,別人可以使用,但看不到裡面的內容。一 靜態庫與動態庫?靜態庫在程式編譯時會被連線到目標 中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在程式執...

Linux下靜態庫生成和使用

1.庫是預編譯的目標檔案 object files 的集合,它們可以被鏈結程序式。靜態庫以後綴為 a 的特殊的存檔 archive file 儲存。2.標準系統庫可在目錄 usr lib與 lib中找到。比如,在類unix系統中c語言的數序庫一般儲存為檔案 usr lib libm.a。該庫中函式的...

linux動 靜態庫的生成和使用

在小烏的眼裡,庫檔案就是資源檔案,也沒有什麼難以理解的 可是如果真要問得深入一點 動態鏈結庫和靜態鏈結庫有什麼區別?怎麼做乙個動態鏈結庫?怎麼生成靜態 動態鏈結庫?什麼叫顯示 隱示呼叫?小烏就鬱悶了,所以今天決定要拍死這些問題。window下面的動 靜態鏈結庫檔名分別為 dll和.lib linux...