DLL中的MSVC未解析的永恒符号

时间:2018-04-08 16:20:13

标签: c++ visual-studio-2013 msvc12

有人可以帮助我理解为什么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并不熟悉,我更习惯nmc++filt ..但对我来说,这表明符号DEG_TO_RAD是导出在DLL中。

在Linker命令行窗口中,我可以看到bin路径(到DLL的路径)是以/LIBPATH提供的,并且还提供了.lib的完整路径(提供)在“附加依赖项”中。)

这可能是因为我可能将共享和静态库混合在一起吗?或者是一个迹象,尽管我认为DLL在我的道路上,不知何故它不是?或者DLL中的符号实际上并不存在? (相当于T

中符号类型的非nm

我正在查看给定in this answer的列表,但到目前为止,我只是对它为什么不起作用感到困惑。

1 个答案:

答案 0 :(得分:0)

问题在于,虽然WML符号已使用__declspec(dllexport)正确导出,但我的应用未正确导入它们。

minimal working example我添加了Wm3Platforms.h的snippit,其中dllexportdllimport被声明。通常(根据我的经验),这些是由单个预处理器定义控制的(如果启用,请执行dll_export,如果禁用,执行dll_import),但此代码需要WM3_DLL_IMPORT声明使它可以进口。

声明WM3_DLL_IMPORT解决了我的问题。

所以,事实证明我的问题是特定于这个lib的源代码....