最近做一個項目,其中用到封裝的一個動態庫(lib+dll),其頭文件定義導出類型為 : #ifdef NetLink
#define NETDIR __declspec(dllexport)
#else
#define NETDIR __declspec(dllimport)
#endif
NETDIR void LinkDir();此動態庫編譯、使用均沒有任何問題。但是,某人突發奇想,能否將動態庫轉成靜態庫?
於是,首先嘗試在代碼上不加任何修改,只在Visual Studio中將編譯選項改成“靜態庫lib”方式,結果在引用的工程中編譯失敗,報 error LNK2019: 無法解析的外部符號錯誤。
難道是由於之前建立工程時選擇的是動態庫方式,因此不行?於是嘗試重建工程,選擇靜態庫方式,並將代碼整體移植。結果報錯依舊。
上網搜索一番,有些思路,再次嘗試將頭文件定義成如下形式: #ifdef NetLink
#define NETDIR extern "C" __declspec(dllexport)
#else
#define NETDIR extern "C" __declspec(dllimport)
#endif
NETDIR void LinkDir();完成後,編譯引用工程,錯誤信息有些變化,之前的很多亂碼符號似的信息變成 error LNK2019: 無法解析的外部符號錯誤 “_imp_LinkDir()”。但還是無法通過編譯。
最終頭文件改成
#define NETDIR extern "C"
NETDIR void LinkDir();
編譯通過。
總結出來:
靜態庫方式定義導出函數只需在前面加上extern "C"即可!
呵呵,小記一篇,高手直接忽略。