一種是lib包含了函式所在的dll檔案和檔案中函式位置的資訊(入口),**由執行時載入在程序空間中的dll提供,稱為動態鏈結庫
一種是lib包含函式**本身,在編譯時直接將**加入程式當中,稱為靜態鏈結庫
共有兩種鏈結方式:
動態鏈結使用動態鏈結庫,允許可執行模組(.dll檔案或.exe檔案)僅包含在執行時定位dll函式的可執行**所需的資訊。
靜態鏈結使用靜態鏈結庫,鏈結器從靜態鏈結庫lib獲取所有被引用函式,並將庫同**一起放到可執行檔案中。
(1)lib是編譯時用到的,dll是執行時用到的。如果要完成源**的編譯,只需要lib;如果要使動態鏈結的程式執行起來,只需要dll。
(2)如果有dll檔案,那麼lib一般是一些索引資訊,記錄了dll中函式的入口和位置,dll中是函式的具體內容;如果只有lib檔案,那麼這個lib檔案是靜態編譯出來的,索引和實現都在其中。使用靜態編譯的lib檔案,在執行程式時不需要再掛動態庫,缺點是導致應用程式比較大,而且失去了動態庫的靈活性,發布新版本時要發布新的應用程式才行。
(3)動態鏈結的情況下,有兩個檔案:乙個是lib檔案,乙個是dll檔案。lib包含被dll匯出的函式名稱和位置,dll包含實際的函式和資料,應用程式使用lib檔案鏈結到dll檔案。在應用程式的可執行檔案中,存放的不是被呼叫的函式**,而是dll中相應函式**的位址,從而節省了記憶體資源。dll和lib檔案必須隨應用程式一起發行,否則應用程式會產生錯誤。
沒有lib,可以直接用dll嗎?
如果不想用lib檔案或者沒有lib檔案,可以用win32 api函式loadlibrary、getprocaddress裝載:
需要函式指標和win32 api函式loadlibrary、getprocaddress裝載,使用這種載入方法,不需要.lib檔案和.h標頭檔案,只需要.dll檔案即可(將.dll檔案置入工程目錄中)。
#include
#include //使用函式和某些特殊變數
typedef
void (*dllfunc)(int);
int main()
dllfunc = (dllfunc)getprocaddress(hinstlibrary, "testdll");
if (dllfunc == null)
dllfunc(123);
std::cin.get();
freelibrary(hinstlibrary);
return(1);
}
loadlibrary函式利用乙個名稱作為引數,獲得dll的例項(hinstance型別是例項的控制代碼),通常呼叫該函式後需要檢視一下函式返回是否成功,如果不成功則返回null(控制代碼無效),此時呼叫函式freelibrary釋放dll獲得的記憶體。
getprocaddress函式利用dll的控制代碼和函式的名稱作為引數,返回相應的函式指標,同時必須使用強轉;判斷函式指標是否為null,如果是則呼叫函式freelibrary釋放dll獲得的記憶體。此後,可以使用函式指標來呼叫實際的函式。
最後要記得使用freelibrary函式釋放記憶體。
面經筆記 管道
匿名管道只能實現本機機器上兩個程序的通訊,通常用來在父子程序間通訊,不能實現跨網路的通訊。下面只貼出核心 父程序 void cparentview onpipecreate startupinfo sui 建立新程序所需資訊結構體 process information pi 程序資訊結構體 zer...
面經筆記 STL
空間配置器 為什麼不說allocator是記憶體配置器 空間不一定是記憶體,空間也可以是磁碟或其他儲存介質,你可以寫乙個allocator直接向硬碟取空間。sgi stl的配置器名為alloc,是預設的空間配置器。雖然也定義了乙個符合部分標準的allocator配置器,但只是把c 中new和dele...
面經 葫蘆面經
1 給定乙個n位數,例如12345,從裡面去掉k個數字,得到乙個n k位的數,例如去掉2,4,得到135,去掉1,5,得到234。設計演算法,求出所有得到的 n k位數裡面最小的那乙個 2 找明星 n個人中,只有乙個明星 明星不認識其他所有的人,而其他人 都認識明星,這些人中也可能相互認識。你每次只...