在 Windows 64 中编译 32 位应用程序时未解析的外部符号

Posted

技术标签:

【中文标题】在 Windows 64 中编译 32 位应用程序时未解析的外部符号【英文标题】:Unresolved external symbols in compiling 32 bit application in Windows 64 【发布时间】:2011-03-10 06:23:41 【问题描述】:

所以我正在尝试将旧版应用程序从 32 位编译到 64 位.. 我重新编译了它使用的所有库,并使其查看了用于库的 WIN SDK6.0A x64 位..

我正在使用:

Visual Studio 专业版 2008 Visual C++ dotNet 框架 3.5 SP1 Windows Server 2008R2 Windows SDK 为 6.0A

一切终于来了,但我收到了这些奇怪的未定义符号错误:

error LNK2019: unresolved external symbol InterlockedDecrement referenced in function ...
error LNK2019: unresolved external symbol InterlockedIncrement referenced in function ...
error LNK2019: unresolved external symbol GetModuleBaseName referenced in ...
error LNK2019: unresolved external symbol EnumProcessModules referenced in ...
error LNK2019: unresolved external symbol EnumProcesses referenced in ...
error LNK2019: unresolved external symbol GetProcessMemoryInfo referenced 

问题是这些都是来自 SDK 的胜利内容。 InterlockedDec 和 InterlockedInc 来自 kernel32.lib GetModuleBaseName、EnumProcessModules、EnumProcesses、GetProcessMemoryInfo 在 psapi.h 中,但也在 kernel32.lib 或 psapi.lib 中

我检查了 C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib\x64 和两个库 kernel32.lib 和 psapi.lib 都在那里。

它肯定会在正确的位置查找库。我打开了 /VERBOSE:LIB 它指向正确的文件夹。

所以我真的很困惑为什么没有找到它们。

有什么想法吗???

谢谢

【问题讨论】:

【参考方案1】:

这是一个很长的镜头(我真的不相信就是这样)但是对于 c++ 编译,可能没有用 extern "C" 正确保护标题?你是包含系统头文件还是只是自己声明函数?

【讨论】:

您尝试过完全重建吗?我注意到 VC++ 时不时会变得“困惑”(它可能会弄乱程序数据库),并且完全重建通常会有所帮助。我会事先删除所有 *.obj、*.exe 和 *.pdb,以防万一……【参考方案2】:

您能否发布您的编译和链接命令行以及代码中的任何#def?

如果您从头开始创建一个仅调用其中一种方法的简单项目,会发生这种情况吗?

【讨论】:

【参考方案3】:

所以我终于想通了,有点... 它没有找到 psapi.lib

在 Project->Linker->Additional dependencies 而不是只说 psapi.lib 我给出了完整的路径并且它起作用了...... 不太清楚为什么之前找不到它,但是哦,好吧......

【讨论】:

如果您使用的是 msvc,您可以使用 #pragma comment(lib, "psapi.lib") 从源代码中添加它。【参考方案4】:

备案:同样的问题,不同的解决方案; 我有一个目录条目

psapi 

添加到列表中

Linker/General/Additional Library Directory 

这导致使用旧的 VS2005 平台 sdk psapi.lib(它只有 x86,没有 x64 版本)。 从已安装的 WinSDK x64/psapi.lib 中删除条目后,现在使用正确的库。 因此,请留意新旧 SDK 的混合/订购! 显然,完整路径也可以使用,但当您在多台机器上使用该项目时可能会出现问题。

【讨论】:

【参考方案5】:

在我的情况下(从 VS2008 迁移到 VS2012),在 VS 2012 的 Linker->input->Additional Dependencies 中添加 psapi.lib 后问题解决了。 p>

【讨论】:

以上是关于在 Windows 64 中编译 32 位应用程序时未解析的外部符号的主要内容,如果未能解决你的问题,请参考以下文章

在Windows系统中使用VC9VC11编译32位64位PHP及其扩展

将 32 位 Windows 驱动程序移植到 64 位 Windows

在 64 位 Windows 上安装 32 位或 64 位应用程序有啥区别?

64 位 Windows:longjmp 位于错误的位置

openssl windows编译 32位&64位

如何使用 Visual C++ 2010 Express 从 32 位环境为 64 位 Windows 编译 Qt?