程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言動態庫轉靜態庫不爽記

C語言動態庫轉靜態庫不爽記

編輯:關於C語言

 最近做一個項目,其中用到封裝的一個動態庫(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"即可!
呵呵,小記一篇,高手直接忽略。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved