DLL 中 MSVC 未解析的永恒符号

MSVC Unresolved Eternal Symbols in DLL

本文关键字:永恒 符号 MSVC DLL      更新时间:2023-10-16

有人可以帮助我理解为什么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:UsersmrussellworkspaceMattbuild-conan-ReleaseLibrariesMattClientExternalNavConverter.lib(ExternalNavConverter.obj)    MattClient

符号DEG_TO_RAD在我的Wml.dll文件中定义,我很确定当我启动 MSVC 时,该文件在我的%PATH%中。

DLL 的dumpbin输出为:

dumpbin /exports C:Usersmrussell.conandatawml3.xntcstablepackagea4501f33ae09df332b76b4d6f0e5cebffbe83874binWml3.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:Usersmrussell.conandatawml3.xntcstablepackagea4501f33ae09df332b76b4d6f0e5cebffbe83874libWml3.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不是那么熟悉,我更习惯nmc++filt.. 但对我来说,这表明符号DEG_TO_RAD导出到 DLL 中。

在链接器命令行窗口中,我可以看到 bin 路径(DLL 的路径)作为/LIBPATH提供,并且还提供了.lib的完整路径(在">其他依赖项"中提供)。

这可能是因为我可能将共享库和静态库混合在一起吗? 或者表明尽管我认为 DLL 在我的道路上,但不知何故并非如此? 或者 DLL 中的符号实际上并不存在?(相当于符号类型的非Tnm)

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

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

在最小的工作示例中,我添加了一个Wm3Platforms.h截图,其中声明了dllexportdllimport。 通常(根据我的经验)至少,这些由单个预处理器定义控制(如果打开,则执行dll_export,如果关闭,则执行dll_import),但此代码要求声明WM3_DLL_IMPORT以使其可导入。

声明WM3_DLL_IMPORT解决了我的问题。

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