標籤:.net 庫檔案 修改 vc++目錄 應該 fine 告訴 代碼 china
原文地址:https://my.oschina.net/SysuHuyh5LoveHqq/blog/644622
近期在windows下開發了某個程式,需要將其產生靜態檔案(lib)以及動態庫檔案(dll),其中參考了不少文章,有的講得也不是很清楚明白,先將本人實踐過的記錄一下,供後期自己查詢,也供各位大牛點評。
一、lib檔案的產生與使用
1、lib的產生
相對來說,靜態庫檔案還是比較容易產生和使用的,在代碼上,貌似也不需要更改什麼,舉例說明:
標頭檔函式宣告形式如下:
extern bool Uninitialize();
在VS2010項目中,“建立->項目->Win32項目->靜態庫”,配置好相應的項目屬性即可。
其中大致包括(根據個人項目需要去配置,如何配置可參考網上其他文章,比較多):
“配置屬性->常規->字元集->(選你需要的字元集)”
“VC++目錄->包含目錄”
“VC++目錄->庫目錄”
項目產生之後,會在項目目錄中產生相應的lib檔案,這個lib檔案就是真正的靜態庫檔案。(與dll產生中產生的lib檔案還是不同的,這在dll產生的時候需要特別注意一下)
2、 lib檔案使用,無需過多配置,只需要在“VC++目錄->庫目錄”引入需要的lib檔案即可
二、dll檔案的產生與使用
1、dll的產生
動態庫檔案dll的產生就沒有那麼簡單了,稍微需要修改一點源碼(相比起來,還是比較喜歡Linux下so檔案產生的方式,完全不需要更改源碼,編譯命令修改即可)
同樣舉例說明,windows下源碼例子 ,同樣對於Uniitialize函數,我們需要添加dll匯出宏定於在函式宣告處:
#ifdef __cplusplus#define EXPORT extern "C" __declspec(dllexport)#else#define EXPORT __declspec(dllexport)#endif//.h檔案函式宣告EXPORT extern bool Uninitialize();//.cpp檔案函數實現EXPORT bool Uninitialize(){}
同樣在VS2010項目屬性中,“建立->項目->Win32項目->DLL”,我們也需要設定項目屬性,這與靜態庫基本類似,依賴的lib檔案可在“連結器->輸入”中設定。
項目產生之後,會在項目目錄中產生相應的dll檔案以及一個lib檔案,注意,此處的lib檔案並非靜態庫檔案,而是dll檔案的相應函數匯入庫檔案。
2、dll的使用
dll使用有兩種方式,一個是隱式使用,一種是顯示使用,這裡我只講講我自己實驗過的隱式使用方式,因為此種方式不需要我demo程式中調用介面時更改介面的使用方式(即不需要LoadLibrary以及GetProcAddress等等),關於顯示調用dll介面的方法,大家可參考網上其他很多文章說明
// .h檔案,函式宣告還是需要匯出#ifdef __cplusplus#define EXPORT extern "C" __declspec(dllexport)#else#define EXPORT __declspec(dllexport)#endifEXPORT extern bool Uninitialize();
如上隱式使用dll時,對於介面的標頭檔,我們還是需要匯出宏定義
注意:設定項目屬性的時候,產生dll時產生的對應lib檔案(即dll的函數匯入庫檔案)是需要“VC++目錄->庫目錄”引入的,同時將dll檔案放在項目目錄exe對應的檔案夾下即可
另外的解釋:
https://segmentfault.com/q/1010000000431206
問:我現在有個DLL項目,但是僅僅產生DLL檔案,我還想要產生一個LIB檔案,應該怎麼辦呢? 就是在這個DLL項目下,同時得到DLL和LIB,不需要另外建立一個靜態連結庫工程。
答:在你的項目裡需要至少有一個export symbol
,linker
才會為你建立.lib
檔案。
你可以在你想要匯出的符號前面加上__declspec(dllexport)
,告訴linker
你需要匯出某個符號(函數,類等等)。然後重新build項目,.lib
檔案應該就會產生了。
例如這樣:
__declspec(dllexport) void hello(void) {...}
[轉]windows下VS2010中lib與dll檔案的產生與使用