32 位到 64 位:LNK2019错误,如何检索相关信息

32-bit to 64-bit : LNK2019 error, how to retrieve relevant information

提问人:Dominique 提问时间:5/30/2018 更新时间:5/31/2018 访问量:868

问:

我正在开发一个 32 位 C++ 应用程序,我正在将其转换为 64 位应用程序(只需选择另一种配置,复制并调整所有相关设置,并尝试让它构建),现在我卡在链接器错误上,我想获得更多信息:
我已经用 32 位重新构建了应用程序, 我已经找到了引用的函数,但是当我按 F12、Shift+F12 或 Ctrl+F12 时,我看不到从哪里检索实现。
LNK2019 "unresolved external symbol ... referenced in function ..."

我认为该函数的实现在DLL中的某个地方,但我想确定它(一旦确认,我就可以查找相应的设置,定义位置,并为我的64位配置复制此设置)。

也许这个问题可以用以下方式重新表述:如果从DLL中检索到函数,是否可以知道该函数是在哪个DLL中实现的?

C++ 可视化工作室 未解析外部

评论

0赞 Raymond Chen 5/30/2018
您可以查看程序的汇编语言,并查看它调用的位置。或者运行程序并按 F11 进入函数以查看它的位置。
1赞 Hans Passant 5/30/2018
让链接器在 32 位版本中生成 .map 文件是查找它的最简单方法。
0赞 Robert Andrzejuk 5/30/2018
@RaymondChen错误来自链接器问题。所以它不能被调试。
1赞 Raymond Chen 5/30/2018
调试有效的 32 位版本。我猜它位于您尚未转换为 64 位的库中。

答:

0赞 Dominique 5/31/2018 #1

Hans,关于 *.map 文件的建议是救命稻草:这让我知道在哪个文件中找到上述函数。
显然,这还不是结束:提到的文件是一个 DLL,虽然没有引用 DLL 本身,而是引用重定向到 DLL 的 LIB 文件。
如果这还不够困难:函数本身就是一个函数,并且似乎有一个问题:
__imp_

  • 32 位:函数(在后面观看两个下划线__imp__imp)
  • 64 位:函数(观察后面的单下划线__imp_imp)

最后,我通过检查构建输出解决了这个问题(比较和条目,并确保它们在两种情况下是相似的:当一个输出中有对 32 位库的引用时,另一个输出中应该有对 64 位库的引用)。
在 32 位输出中,我看到链接器引用了一个库,在 64 位链接的情况下他没有这样做:我在项目的配置中添加了相应的库(配置属性、链接器、输入、其他依赖项),这最终解决了这个问题。
LIB=PATH=