動態鏈結庫和靜態鏈結庫的建立和使用

2021-07-02 04:09:01 字數 2833 閱讀 2919

1. 靜態函式庫

這類庫的名字一般是 lib***.a ;利用靜態函式庫編譯成的檔案比較大,因為整個 函式庫的所有資料都會被整合進目標**中,他的優點就顯而易見了,即編譯後的執行程式不需要外部的函式庫支援,因為所有使用的函式都已經被編譯進去了。當然這也會成為他的缺點,因為 如果靜態函式庫改變了,那麼你的程式必須重新編譯 。

linux下靜態鏈結庫的使用和建立

例程:quick_sort.c  shell_sort.c quick_sort.h  shell_sort.h  main.c

具體檔案**見

快速排序

中的相應檔案。

第一步:gcc -c quick_sort.c shell_sort.c生產鏈結檔案,表示和.h已經鏈結好了quick_sort.o  shell_sort.o

第二步:靜態函式庫的建立 ar 命了建立。

ar cr libmy_sort.a quick_sort.o shell_sort.o

-c : create 的意思   

-r :replace 的意思,表示當插入的模組名已經在庫中存在,則替換同名的模組。如果若干模組中有乙個模組在庫中不存在,ar 顯示乙個錯誤訊息,並不替換其他同名模組。   

-s: 代表若歸檔檔案中包含了物件模式(c++) 。

libmy_sort: lib表示庫,my_sort表示自己建立的庫的名字。

第三步:使用靜態庫

gcc –wall -o main main.c -l. -lmy_sort 

生產的mian

執行檔案已經將靜態鏈結庫全部包含在裡面,就可以直接執行了。

靜態庫製作完了,如何使用它內部的函式呢?只需要在使用到這些公用函式的源程式中包含這些公用函式的原型宣告,然後在用gcc命令生成目標檔案時指明靜態庫名(是mymath 而不是libmymath.a ),gcc將會從靜態庫中將公用函式連線到目標檔案中。注意,gcc會在靜態庫名前加上字首lib,然後追加副檔名.a得到的靜態庫檔名來查詢靜態庫檔案。

2. 動態函式庫

linux下動態鏈結庫的使用和建立

第一步:建立:

動態庫檔名命名規範和靜態庫檔名命名規範類似,也是在動態庫名增加字首lib,但其擴充套件名為.so。

gcc -shared -fpci -o libmy_sort.so quick_sort.o shell_sort.o

第二步:使用

gcc –wall -o main main.c -l. -lmy_sort   

執行檔案知道了執行的時候要去找-lmy_sort

./main

出現錯誤,./main: error while loading shared libraries:libmymath.so: cannotopen shared object file: no such file or directory

這是由於在執行

main

的時候,其要去找鏈結庫-lmy_sort,一般都是去/lib-->/usr/lib-->/usr/local/lib

這幾個中尋找的,,找不到就會出現錯誤,不能執行,這個時候就要將檔案libmy_sort.so複製到目錄/usr/lib中:

cp libmy_sort.so /usr/lib

或者改變環境變數,將預設路徑轉換成我們自己定義的路徑。

(這一部分後續有待增加)

gcc -wall -o main main.c -i /home/share/quick/ -l/home/share/include/ -lmy_sort

gcc -wall -o main main.c -i /home/share/quick/ -l/home/share/include/ -lmy_sort

-wall   

開啟gcc

的所有警告

gcc -i -l -l的區別:

gcc -o hello hello.c -i/home/hello/include -l /home/hello/lib -lworld

上面這句表示在編譯

main.c

時-i/home/share/quick/表示將/home/share/quick/目錄作為第乙個

尋找標頭檔案的目錄,

尋找的順序是:/home/share/quick/-->/usr/include-->/usr/local/include

-l/home/share/include/表示將/home/share/include/目錄作為

第乙個尋找庫檔案的目錄,

尋找的順序是:/home/share/include/-->/lib-->/usr/lib-->/usr/local/lib

-lmy_sort表示在上面的

lib的路徑中尋找-lmy_sort.so

動態庫檔案(如果

gcc編譯選項中加入了

「-static」

表示尋找-lmy_sort.a

靜態庫檔案)

動態鏈結庫和靜態鏈結庫

函式和資料被編譯進乙個二進位制檔案 通常擴充套件名為.lib 在使用靜態庫的情況下,在編譯鏈結可執行檔案時,鏈結器從庫中複製這些函式和資料並把它們和應用程式的其它模組組合起來建立最終的可執行檔案 exe檔案 在使用動態鏈結庫的時候,往往提供兩個檔案 乙個引入庫和乙個dll。引入庫包含被dll匯出的函...

建立靜態鏈結庫 動態鏈結庫

下面的實操中的動態庫或者靜態庫名都用wujunwu 第一步 建立乙個源 建立靜態鏈結庫的源 include void func1 void int func2 int x,int y 第二步 建立乙個.件作為函式宣告 void func1 void intfunc2 int x,int y 第三步 ...

動態鏈結庫和靜態鏈結庫的區別

平時總聽人講動態鏈結庫 靜態鏈結庫 lib dll so等名詞,一直搞不清楚這幾者之間的區別以及各自的應用場合。後來上網仔細查了一下資料,終於搞清楚了,在這裡整理一下先。動態鏈結庫 動態鏈結庫中包含了多個已經被編譯 鏈結好的函式和資料資源,但並不包含函式的原始碼。動態鏈結庫在windows下是.dl...