生成動態連線庫 靜態連線庫的 makefile

2022-03-25 09:42:13 字數 756 閱讀 7142

靜態連線庫(擴充套件名為 .a)是.o檔案的簡單集合。在 linux/unix下,使用 ar 命令生成靜態連線庫。 

動態連線庫(擴充套件名為.so) 是將.o檔案集合,並增加了匯出表。匯出表是乙個函式名、函式索引、函式位址的陣列。因此,應用程式可以裝載(使用 ldopen函式)後,根據函式名,匯出函式的索引位置來呼叫函式。

動態連線庫的優點在於:程式可以獨立於連線庫,即不需要包含標頭檔案。

兩種連線庫都可以減少模組間的依賴。

兩種連線庫的檔名都必須有 lib字首。

可以使用 nm 命令檢視連線庫有哪些匯出選項。

可以使用 ldd 命令檢視應用程式需要哪些連線庫。

可以一次性地指定編譯當前目錄下的所有 .cpp 檔案為乙個 連線庫檔案:在makefile 中

obj = $(shell find . -name "*.cpp" -printf "%p " | sed -e "s/.cpp/.o/g" )

find 引數解釋:

. 當前目錄及所有子目錄。如果要指定只有當前目錄,則配合使用 引數-maxdepth 1

-name 檔名。可使用萬用字元。

-printf表示不加換行符地輸出, 格式化引數 "%p"表示輸出完整的檔名及路徑。如果不需要使用路徑,可使用 「%f」。

sed 引數解釋:

-e 表示使用正規表示式

s 表示執行文字替換,後面的兩個引數表示把 .cpp 替換為 .o , g表示全部替換( global replace )。如果沒有 g ,則只替換一次。

動態連線庫和靜態連線庫有什麼區別?

靜態庫在程式執行時就會裝入記憶體,而動態庫在呼叫的時候才裝入!首先糾正所謂 靜態連線就是把需要的庫函式放進你的exe之中 的說法。在真實世界中,有三個概念 use static libary,static linked dll,dynamic linked dll.多數人混淆了static liba...

linux動態庫與靜態庫混合連線

1,在應用程式需要連線外部庫的情況下,linux預設對庫的連線是使用動態庫,在找不到動態庫的情況下再選擇靜態庫。使用方式為 gcc test.cpp l.ltestlib 如果當前目錄有兩個庫libtestlib.so libtestlib.a 則肯定是連線libtestlib.so。如果要指定為連...

動態連線庫

windows下動態鏈結庫的編寫 在vc中新建乙個空的win32動態鏈結庫工程 win32 domanic library 然後新增乙個c sourse file到工程,我這裡的檔名取dlltest.cpp。然後在檔案中新增如下內容 declspec dllexport int add int a,...