【发布时间】:2018-04-08 16:20:13
【问题描述】:
谁能帮我理解为什么 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% 中。
dumpbin 的 DLL 输出为:
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 文件。
我对@987654331@不太熟悉,我更习惯nm和c++filt..但对我来说,这表明符号DEG_TO_RAD是在DLL中导出的。
在链接器命令行窗口中,我可以看到 bin 路径(DLL 的路径)作为 /LIBPATH 提供,并且还提供了 .lib 的完整路径(在“其他依赖项”。)
这可能是因为我可能将共享库和静态库混合在一起了吗?或者一个迹象表明,尽管我认为 DLL 在我的路径中,但不知何故它不是?或者 DLL 中的符号实际上并不存在? (相当于nm 中符号类型的非T)
我正在浏览in this answer 给出的列表,但到目前为止我只是对它为什么不起作用感到困惑。
【问题讨论】:
-
这是一个链接器错误,您需要链接
Wml.lib(Wml.dll 的导出库)。在链接阶段,链接器对Wml.dll没有兴趣。 -
除了 Richard 所说的之外,Visual Studio 项目选项还有一个链接器设置部分,您可以在其中指定“附加依赖项”。您可以在此处放置与该 DLL 对应的 LIB 文件的名称。
-
嘿@Richard Critten,是的,我正在链接
Wml.lib,正如我上面所说,Wml.lib在我的Additional Dependencies中指定。尽管共享库的.libs 通常只声明在dll中实际定义的符号,但我的印象是,所以不是必须在 PATH 中找到 DLL 吗?无论如何,是的,指定了“lib”。这就是我如此困惑的原因。 -
是的,DLL 需要在 运行时 可以找到。但是
LNK2019是链接时间错误。 -
好吧,所以我仍然不知道为什么它不会链接。符号在库中,
.lib被指定为链接目标,错误中的符号与dumpbin中的符号匹配。 :(
标签: c++ visual-studio-2013 msvc12