Liunx建立與使用靜態庫和動態庫

2021-09-27 07:45:17 字數 1301 閱讀 8310

我們編寫的**要經過預編譯→編譯→彙編→鏈結後才會生成可執行檔案。靜態庫與動態庫的區別就在於其在鏈結階段的鏈結方式不同。靜態庫會將彙編生成的目標檔案.o與引用到的庫一起鏈結打包到可執行檔案中。因此對應的鏈結方式稱為靜態鏈結。而動態庫在程式鏈結時並不會被複製到目標**中,而是在程式執行是才被載入。不同的應用程式如果呼叫相同的庫,那麼在記憶體裡只需要有乙份該共享庫的例項,規避了空間浪費問題。動態庫在程式執行是才被載入,也解決了靜態庫對程式的更新、部署和發布頁會帶來麻煩。使用者只需要更新動態庫即可,增量更新。總結兩者的優缺點以及特點:1.靜態庫對函式庫的鏈結是放在編譯時期完成的;2.靜態鏈結的程式在執行時與函式庫再無瓜葛,移植方便;3.靜態鏈結浪費空間和資源,因為所有相關的目標檔案與牽涉到的函式庫被鏈結合成乙個可執行檔案;4. 動態庫把對一些庫函式的鏈結載入推遲到程式執行的時期;5. 動態鏈結可以實現程序之間的資源共享。(因此動態庫也稱為共享庫);6. 動態鏈結將一些程式公升級變得簡單;7. 動態庫甚至可以真正做到鏈結載入完全由程式設計師在程式**中控制(顯示呼叫)。

第一步生成目標檔案xxx

.o

***.o

xxx.

o

g++ -c ***.cc
引數-c表示生成***.o的目標檔案。該指令執行之後就會在當前目錄下生成乙個與原始檔同名的.o檔案。

第二步將目標檔案打包成靜態檔案

ar -crv lib***.a ***.o
ar指令指定引數-crv會將***.o檔案生成靜態檔案,靜態檔案的命名必須是lib開頭的.a檔案,時候會在當前目錄下生成乙個lib***.a檔案。

g++ 源檔名.cc -l 靜態檔案所在目錄的位置 -l***
原始檔必須是使用了靜態檔案,靜態檔案所在目錄的位置可以是相對路徑也可以是絕對路徑,也可以將用到的靜態檔案放到/usr/lib檔案下,著用就不用指定路徑了。後面的-l***就是靜態檔案的標記,如靜態檔案為lib***.a則在編譯時就是-l***(l是l的小寫)。

第一步生成目標檔案,需要加上-fpic引數(建立於位址無關的編譯程式,是為了讓多個應用程式間共享)。

g++ -fpic -c ***.xx

之後會在當前目錄下生成乙個***.o檔案

第二步生成動態庫

g++ -shared -o lib***.so ***.o

指定引數-shared表示生成動態鏈結庫。時候會在當前檔案下生成乙個lib***.so檔案。

這兩步可以合成一步:g++ -fpic -shared -o lib***.so ***.cc

靜態庫建立與使用

1 在選單欄上,依次選擇 檔案 新建 專案 2 在 新建專案 對話方塊的左窗格中,依次展開 已安裝 模板 visual c 然後選擇 win32 3 在中間窗格中,選擇 win32 控制台應用程式 4 在 名稱 框中為專案指定名稱,例如 mathfuncslib。在 解決方案名稱 框中為解決方案指定...

建立使用 framework和 a靜態庫

簡介 在開發中.framework靜態庫還是比較常見的,比如 sdk,公司間的 合作等。我們可以把一些不願意讓別人見到的 用靜態庫的方式把它隱藏起來,只留下.件顯示方法供程式設計人員使用。而.a檔案出了靜態庫本身外,還需要引入.件,而.framework就不需要如此,由於.framework的方便性...

Linux下靜態庫和動態庫的建立與使用

靜態庫 假設當前有乙個 c 語言專案,其目錄結構如下所示 demo專案 headers test.h sources add.c sub.c div.c main.c 可以看到,該專案中包含 1 個頭檔案 h 4 個原始檔 c 它們各自包含的 如下所示 整個專案的邏輯很簡單,其中 add.c sub...