extern "C" --------------在C++編譯器中使用
作用是告訴C++編譯器不要修改函數、變量的名稱,因此通常用在dll文件編譯參數中,使dll文件多次編譯時,輸出的函數、變量名稱保持不變。相反的,__stdcall修飾函數時,編譯後的函數名將發生變化,如__FUNCXX@112
__declspec(dllexport) 聲明函數、變量 ----------------告訴編譯器該函數、變量是輸出給其他代碼調用的。
__declspec(dllimport) 聲明函數、變量--------------告訴編譯器該函數、變量是由其他dll模塊定義的,不能僅僅使用extern。
隱式鏈接dll:
應用程序中不需指明dll文件的實際存儲路徑,可以直接使用相關函數。
產生dll時同步生成導入庫lib文件;
編譯exe時,需要h頭文件、lib導入庫文件(#pragma comment(lib, "..\\XXX.lib"));
執行exe時,需要dll動態庫文件。
顯式鏈接的dll:
不生成導入庫,應用程序在使用dll時需要指明庫文件名稱、路徑;
調用LoadLibary調入DLL文件,然後再手工GetProcAddress獲得對應函數。
windows導入庫(.lib文件)和linux下的靜態庫(.a文件)的區別:
靜態庫本身就包含了實際執行代碼、符號表等等,而對於導入庫而言,其實際的執行代碼位於動態庫中,導入庫只包含了地址符號表等,幫助程序找到對應函數的一些基本地址信息。