Linux下靜態庫編譯

2021-06-18 16:58:58 字數 1748 閱讀 3459

linux下動態庫檔案的擴充套件名為".so"(shared object)。按照約定,所有動態庫檔名的形式是libname.so(可能在名字中加入版本號)。這樣,執行緒函式庫被稱作libthread.so。靜態庫的檔名形式是libname.a。共享archive的檔名形式是libname.sa。共享archive只是一種過渡形式,幫助人們從靜態庫轉變到動態庫。

作業系統:debian/gnu linux 2.6.21-2-686;

gcc版本:4.1.3

一、庫檔案及測試檔案**

庫檔案及測試檔案所在的目錄:/home/program/。

1.庫檔名:myfunction.c   

#include

int

my_lib_function (void)

2.測試檔名:test.c

#include

int main(void)

二、動態庫的編譯方法

編譯庫檔案myfunction.c:

debian:/home/program# gcc -shared -o libmyfunction.so myfunction.c

如果編譯成功,會在/home/program/下生成動態庫檔案:libmyfunction.so。

這裡有兩點需要說明:

1.對linux操作,一般都推薦在普通使用者模式下,如果需要超級使用者的許可權,則可以通過su root,輸入root使用者密碼切換。我是個人學習使用,同時又有很多的操作都要使用root使用者,因此就直接在root使用者下進行編譯。

2.編譯生成動態庫的命令為:gcc (-fpic) -shared -o libmyfunction.so myfunction.c

-fpic 使輸出的物件模組是按照可重定位位址方式生成的。

-shared指定把對應的原始檔生成對應的動態鏈結庫檔案。

三、動態庫的測試方法

編譯測試檔案test.c:

debian:/home/program# gcc -o test test.c /home/program/libmyfunction.so

成功編譯後,生成test檔案,執行test:

debian:/home/program# ./test

library routine called from libmyfunction.so!

其中,gcc -o test test.c /home/program/libmyfunction.so的最後乙個引數指定所鏈結庫檔案的絕對路徑。本例中庫檔案的絕對路徑為:/home/program/libmyfunction.so。

debian:/home/program# cp libmyfunction.so /usr/lib/

debian:/home/program# gcc -o test test.c -lmyfunction

debian:/home/program# ./test

library routine called from libmyfunction.so!

這裡,對於鏈結的方法作一下解釋。對於gcc -o test test.c -lmyfunction中最後乙個引數-lmyfunction, 可見傳給c編譯器的命令列引數並未提到函式庫的完整路徑名,甚至沒有提到在函式庫目錄中該檔案的完整名字!實際上,編譯器被告知根據選項-lmyfunction鏈結到相應的函式庫(/usr/lib下),函式庫的名字是libmyfunction.so, 也就是說,"lib"部分和檔案的副檔名被省略了,但在前面加了乙個l。

Linux 下編譯鏈結動靜態庫

linux 版本是 red hat 9 核心版本是 2.4.18 輸入 which gcc 檢視 gcc 的位置在 usr bin gcc gcc v 檢視 gcc 編譯前的配置資訊 prefix usr 說明了安裝目錄 沒有 with headers 說明預設的 include 就在安裝目錄下 所...

linux下編譯靜態庫並呼叫

目錄結構如下 root ubuntu home aaa maketest ls l total 12 rw r r 1 root root 127 sep 24 19 09 main.cpp rw r r 1 root root 99 sep 24 19 18 test.cpp rw r r 1 r...

Linux下編譯靜態庫 a 和動態庫 so

靜態庫 在linux環境中,使用ar命令建立靜態庫檔案.如下是命令的選項 d 從指定的靜態庫檔案中刪除檔案 m 把檔案移動到指定的靜態庫檔案中 p 把靜態庫檔案中指定的檔案輸出到標準輸出 q 快速地把檔案追加到靜態庫檔案中 r 把檔案插入到靜態庫檔案中 t 顯示靜態庫檔案中檔案的列表 x 從靜態庫檔...