0

有人可以帮我理解为什么 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是在我的文件中定义的,当我启动 MSVC 时Wml.dll,我很确定它在我的文件中。%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)

我在这里设置了一个显示链接失败的最小示例,不幸的是我不确定我是否可以放置标题或.lib文件。

我对 . 不太熟悉dumpbin,我更习惯nm..c++filt但对我来说,这表明符号DEG_TO_RAD是在 DLL 中导出的。

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

这可能是因为我可能将共享库和静态库混合在一起吗?或者一个迹象表明,尽管我认为 DLL 在我的路径中,但不知何故它不是?或者 DLL 中的符号实际上并不存在?(等价于非T符号类型 in nm

我正在浏览这个答案中给出的列表,但到目前为止我只是对它为什么不起作用感到困惑。

4

1 回答 1

0

问题是,虽然使用 正确导出了 WML 符号__declspec(dllexport),但我的应用程序没有正确导入它们。

最小的工作示例中,我添加了声明Wm3Platforms.h位置dllexportdllimport声明的片段。通常(根据我的经验)至少,这些由单个预处理器定义控制(如果 on,do dll_export,如果 off,do dll_import),但是声明此代码要求WM3_DLL_IMPORT使其可导入。

声明WM3_DLL_IMPORT解决了我的问题。

所以,原来我的问题是特定于这个库的源代码......

于 2018-04-09T13:44:15.077 回答