有人可以帮助我理解为什么MSVC 12 2013会报告这些符号尚未解决吗?
Error 239 error LNK2019: unresolved external symbol "public: static double const Wm3::Math<double>::DEG_TO_RAD" (?DEG_TO_RAD@?$Math@N@Wm3@@2NB) referenced in function "protected: void __cdecl Matt::ExternalNavConverter::CExternalNavConverter::DoProcessExternalNav(void)" (? DoProcessExternalNav@CExternalNavConverter@ExternalNavConverter@Matt@@IEAAXXZ) C:\Users\mrussell\workspace\Matt\build-conan-Release\Libraries\MattClient\ExternalNavConverter.lib(ExternalNavConverter.obj) MattClient
我的DEG_TO_RAD
文件中定义了符号Wml.dll
,当我启动MSVC时,我非常确定它位于%PATH%
。
DLL的dumpbin
输出为:
dumpbin /exports C:\Users\mrussell\.conan\data\wml\3.x\ntc\stable\package\a4501f33ae09df332b76b4d6f0e5cebffbe83874\bin\Wml3.dll | grep -i DEG_TO_RAD
143 8E 00031A64 ?DEG_TO_RAD@?$Math@M@Wm3@@2MB
144 8F 00031A98 ?DEG_TO_RAD@?$Math@N@Wm3@@2NB
对于LIB:
dumpbin /exports C:\Users\mrussell\.conan\data\wml\3.x\ntc\stable\package\a4501f33ae09df332b76b4d6f0e5cebffbe83874\lib\Wml3.lib | grep DEG_TO_RAD
?DEG_TO_RAD@?$Math@M@Wm3@@2MB (public: static float const Wm3::Math<float>::DEG_TO_RAD)
?DEG_TO_RAD@?$Math@N@Wm3@@2NB (public: static double const Wm3::Math<double>::DEG_TO_RAD)
我设置了minimal example showing the failed linking here,遗憾的是我不确定我可以放置标题或.lib
文件。
我对dumpbin
并不熟悉,我更习惯nm
与c++filt
..但对我来说,这表明符号DEG_TO_RAD
是导出在DLL中。
在Linker命令行窗口中,我可以看到bin路径(到DLL的路径)是以/LIBPATH
提供的,并且还提供了.lib
的完整路径(提供)在“附加依赖项”中。)
这可能是因为我可能将共享和静态库混合在一起吗?或者是一个迹象,尽管我认为DLL在我的道路上,不知何故它不是?或者DLL中的符号实际上并不存在? (相当于T
)
nm
我正在查看给定in this answer的列表,但到目前为止,我只是对它为什么不起作用感到困惑。
答案 0 :(得分:0)
问题在于,虽然WML符号已使用__declspec(dllexport)
正确导出,但我的应用未正确导入它们。
在minimal working example我添加了Wm3Platforms.h
的snippit,其中dllexport
和dllimport
被声明。通常(根据我的经验),这些是由单个预处理器定义控制的(如果启用,请执行dll_export
,如果禁用,执行dll_import
),但此代码需要WM3_DLL_IMPORT
声明使它可以进口。
声明WM3_DLL_IMPORT
解决了我的问题。
所以,事实证明我的问题是特定于这个lib的源代码....