在 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