在windows下,動態庫dll的使用往往伴隨著lib的指引,而linux使用動態庫和靜態庫則有較大的不同。
1. 靜態庫
名字一般是lib***.a;利用靜態函式庫編譯成的檔案比較大,因為整個 函式庫的所有資料都會被整合進目標**中,編譯後的執行程式不需要外部的函式庫支援,但是,公升級比較麻煩。每一次版本更新都需要重新編譯。
2. 動態庫
名字一般是lib***.so;動態庫沒有被編譯進最終程式,只有在需要的時候,動態載入到記憶體中。編譯後的程式不包含動態庫部分,程式的執行需要動態庫的支援,公升級方便。
靜態庫的操作工具:gcc(g++)和ar 命令。
編寫及使用靜態庫
(1)設計庫原始碼test1.cpp和test2.cpp
test1.cpp**內容如下:
#include
void bye1()
test2.cpp**內容如下:
#include
void bye2()
(2) 編譯原始檔
$ g++ -o -c test1.cpp test2.cpp //命令列操作
做完之後 用 ls命令檢視是否生成兩個test1.o test2.o 檔案
(3) 打包靜態庫
為了在編譯程式中正確找到庫檔案,靜態庫必須按照 lib[name].a 的規則命名,如下例中[name]=test.
$ ar -rsv libtest.a test1.o test2.o //命令列操作,將.o檔案打包成libtest.a
$ ls -l *.a //命令列,檢視生成的.a檔案
$ ar -t libpr.a //檢視庫檔案中包含的檔案
(4) 呼叫庫函式** main.cpp
main.cpp中的**:
#include"test1.cpp"
#include"test2.cpp"
int main()
(5) 編譯鏈結選項
-l 及-l 引數放在後面.其中,-l 載入庫檔案路徑,-l 指明庫檔案名字.
$ gcc -o main main.c -l./ -ltest //生成可執行檔案
(6)執行目標程式
$ ./main
編寫動態庫
(1)設計庫**
設計生成動態庫的原始檔**:
dlluse.cpp**如下:
#include
void print()
(2)生成動態庫
$ gcc -o -fpic -shared -o dl.so dlluse.cpp //生成動態庫
$ ls -l *.so //檢視生成的動態庫
態庫的隱式呼叫 (顯式比較頭疼)
在編譯呼叫庫函式**時指明動態庫的位置及名字, 看下面例項
呼叫函式main.cpp:
#include"dlluse.cpp"
int main()
$ gcc -o main main.c ./dl.so //鏈結生成可執行程式
$ ./main //執行程式
當動態庫的位置活名字發生改變時, 程式將無法正常執行; 而動態庫取代靜態庫的好處之一則是通過更新動態庫而隨時公升級庫的內容.
使用ldd命令來檢視執行檔案依賴於哪些庫。
Linux靜態庫與動態庫的使用
一 linux基本操作命令 首先建立unsgn pow.c檔案,包含unsgn pow 函式的定義 建立檔案 root localhost cd home root localhost home mkdir aiy root localhost home cd aiy root localhost ...
Linux靜態庫與動態庫
靜態庫 a 靜態庫的 在編譯過程中已經被載入可執行程式,因此體積較大。編譯程式時候需要庫作依賴,執行時候不需要。方便,不再需要外部函式庫支援 缺點 1 因為靜態庫被鏈結後直接嵌入可執行程式中,相當於每乙個可執行程式裡都有乙個庫的副本,浪費空間 2 一旦庫中有bug,需要重新編譯。建立步驟 1 編寫函...
linux動態庫與靜態庫
現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始。盡量不重複做別人已經做過的事,站在巨人的肩膀上 做事情。根據鏈結時期的不同,庫又有 靜態庫和共享庫 動態庫 二者的不同點在於 被載入的時刻不同,靜態庫的 在編譯過程中已經被載入可執行程式,因此體積較大。共享庫的 是在可執行程式執行時...