VS 鏈接問題 warning C4273: dll 鏈接不一致
今天使用 VS2015 編譯程序,突然發(fā)現(xiàn)一個鏈接問題
warning C4273: dll 鏈接不一致
查了一下,原來這是由于 Windows DLL 動態(tài)庫的導(dǎo)入導(dǎo)出不匹配造成的。在使用 VS2015 編寫 DLL 程序時,頭文件中必須使用 __declspec
進(jìn)行聲明: 在提供者那里方法應(yīng)該被聲明為 __declspec(dllexport),在使用者那里方法應(yīng)該被聲明為 __declspec(dllimport) 。當(dāng)然 Linux 中沒有這個問題。
造成這個告警的原因是:生成 DLL 時只使用了 __declspec(dllexport)
,但在調(diào)用時未使用 __declspec(dllimport)
進(jìn)行聲明:
-
__declspec(dllexport)
導(dǎo)出庫文件標(biāo)志,沒有這個標(biāo)志,無法生成 *.lib 文件,只能在庫文件本身的工程中使用。 -
__declspec(dllimport)
導(dǎo)入庫文件標(biāo)志,給外部調(diào)用者使用的,沒有這個標(biāo)志,外部調(diào)用者會找不到庫文件中指定的符號。
所以經(jīng)常可以在 Windows DLL 的頭文件中看到如下宏定義,就是為例解決這個問題的
#ifdef _WIN32
#ifdef LIBRARY_EXPORTS
#define API_EXPORTS __declspec(dllexport)
#else
#define API_EXPORTS __declspec(dllimport)
#endif
#else
#define API_EXPORTS
#endif
class API_EXPORTS ClassName {
// ...
};
在 Windows 中,DLL 生成方需要定義 LIBRARY_EXPORTS
宏,而 DLL 調(diào)用方則不需要定義這個宏,這樣就可以解決生成方和調(diào)用方導(dǎo)出和導(dǎo)入的問題。在 Linux 中,這個宏定義沒有任何作用。
當(dāng)然,若是以 C 語言的形式導(dǎo)出 API,還需要 extern "C"
進(jìn)行聲明,如下所示文章來源:http://www.zghlxwxcb.cn/news/detail-404090.html
extern "C" API_EXPORTS unsigned long long fibonacci(const int n);
參考資料文章來源地址http://www.zghlxwxcb.cn/news/detail-404090.html
- Walkthrough: Create and use your own Dynamic Link Library (C++)
到了這里,關(guān)于VS 鏈接問題 warning C4273: dll 鏈接不一致的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!