linux下c語言動態庫生成方法

2021-06-21 16:03:16 字數 1389 閱讀 3232

linux下動態庫檔案的擴充套件名為".so"(shared object)。按照約定,所有動態庫檔名的形式是libname.so(可能在名字中加入版本號)。靜態庫的檔名形式是libname.a。

本文僅以簡單的例子介紹動態庫檔案的生成和鏈結方法。

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

庫檔案及測試檔案所在的目錄:/root/so/

1.庫檔名:myfirstso.c

#include

void myfunction()

2.測試檔名:test.c

#include

int main(int argc,char *argv)

二、動態庫的編譯方法

編譯庫檔案myfirstso.c:

[root@mgt so]# gcc -fpic -shared -o libmyfirstso.so myfirstso.c

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

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

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

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

三、動態庫的測試方法

編譯測試檔案test.c:

[root@mgt so]# gcc -o test test.c /root/so/libmyfirstso.so

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

[root@mgt so]# ./test

this is a shared object

其中,gcc -o test test.c /root/so/libmyfirstso.so的最後乙個引數指定所鏈結庫檔案的絕對路徑。本例中庫檔案的絕對路徑為:/root/so/libmyfirstso.so。 如果直接寫相對路徑會有錯誤。

[root@mgt so]# cp libmyfirstso.so /usr/lib

[root@mgt so]# gcc -o test test.c -lmyfirstso

[root@mgt so]# ./test

this is a shared object

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

Linux下C 動態庫的生成和使用

1.匯出函式的動態庫 ifndef dlltest h define dlltest h extern c int add int a,int b typedef int add t int a,int b endif include dlltest.h int add int a,int b 上述...

linux下動態庫和靜態庫生成

有時候需要把一組 編譯成乙個庫,這個庫在很多專案中都要用到,例如libc就是這樣乙個庫,我們在不同的程式中都會用到libc中的庫函式 例如printf 也會用到libc中的變數 例如以後 要講到的environ變數 本文將介紹怎麼建立這樣乙個庫。這些檔案的目錄結構是 tree main.c stac...

Linux下C 動態庫

本人是剛畢業的大學生一枚,這是寫的第一篇部落格,若有不對的地方,懇請指正!由於工作原因,不得已在linux下開發專案,而且還是用c 對於c 本人是有一些白痴的。專案完成,在此做一下總結,給自己乙個交代。首先先對動態庫方面的只是做乙個總結 1 動態庫的簡單介紹 首先,動態庫就是動態鏈結庫,本人有些懶,...