庫分為兩種:一種是靜態庫(.a和.lib) 和動態庫(.so和.dll)。
所謂靜態,動態是指鏈結
靜態庫其在鏈結階段,會將生成的目標檔案.o與引用到的庫一起鏈結打包到可執行檔案中,因此對應的鏈結方式是靜態鏈結
靜態庫特點總結:
1.靜態庫對函式庫的鏈結是放在編譯時期完成的
2.程式在執行時與函式庫再無瓜葛,移植方便
3.浪費空間和資源,因為所有相關的目標檔案與牽扯到的函式庫被鏈結合成乙個可執行檔案
linux靜態庫命名規則
必須是 ** lib[your_library_name].a **,lib是字首,中間是靜態庫名,擴充套件名為.a
g++
-c math.cpp
然後通過ar工具將目標檔案打包成.a靜態庫檔案
ar -crv libmath.a math.o
生成靜態庫 libmath.a
g++ test.cpp -l.
-lmath
共享庫
動態庫在程式編譯時並不會被鏈結到目標**中,而是在程式執行時才被載入。不同的應用程式如果呼叫相同的庫,那麼在記憶體裡面只需要有乙份該共享庫的示例,規避了空間浪費問題。
linux下建立與使用動態庫
linux的動態庫的命名規則
動態鏈結庫的名字形式為 ** lib***.so** ,字首是lib,字尾是.so
1.針對於實際庫檔案,每個共享庫都有個特殊的名字 soname。在程式啟動後,程式通過這個名字來告訴動態載入器該載入那個共享庫
2.在檔案系統中,soname僅是乙個鏈結到實際動態庫的鏈結。
建立動態庫
1.生成目標檔案
g++
-fpic -c math.cpp
-fpic是建立與位址無關的編譯程式,(position independent code),是為了能夠在多個應用程式間共享
2.生成動態庫
g++
-shared -o libmath.so math.o
-shared是指定生成動態鏈結庫
上面兩個步驟合為乙個命令
g++
-fpic -shared -o libmath.so math.cpp
使用動態鏈結庫g++ test.cpp -l.
-lmath
通過 ln -s 加realname ,可以生成linkname此時執行可能會報錯,需要把動態庫載入到指定位置通過wl可以生成soname
靜態庫和動態庫的區別
windows vc 靜態庫 在編譯的時候載入生成目標檔案,在執行時不用載入庫,在執行時對庫沒有依賴性。動態庫 在目標檔案執行時載入,手動載入,且對庫有依賴性。兩者區別 一,靜態庫的使用需要 1 包含乙個對應的標頭檔案告知編譯器lib檔案裡面的具體內容 2 設定lib檔案允許編譯器去查詢已經編譯好的...
靜態庫和動態庫的區別
靜態庫在程式編譯時被連線到目標 中,程式執行時不再需要靜態庫 動態庫在編譯時並不被連線到目標 中,而是程式執行時才被載入,執行時仍然需要動態庫存在。靜態庫的命名規範是以 lib為字首,緊接著是靜態庫名,副檔名是.a 先將檔案編譯成 o 檔案然後是編譯成靜態檔案 動態庫檔案在檔名前加 lib字首,擴充...
靜態庫和動態庫的區別
庫的作用 庫是共享程式 的方式,一般分為靜態庫和動態庫。庫實現了某些特定的功能模組化。方便分享和使用!異同點 2.靜態庫和動態庫有什麼特點?不同點 靜態庫 鏈結時完整地拷貝至可執行檔案中,被多次使用就有多份冗餘拷貝。動態庫 鏈結時不複製,程式執行時由系統動態載入到記憶體,供程式呼叫,系統只載入一次,...