在 Windows 64 位系统中编译 32 位应用程序时出现未解决的外部符号

11

我正在尝试将一个旧的32位应用程序编译为64位。

我重新编译了所有使用的库,并让它查找WIN SDK6.0A x64位库。

我使用的工具和环境如下:

  • Visual Studio 2008专业版
  • Visual C++
  • dotNet Framework 3.5 SP1
  • Windows Server 2008 R2
  • 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的win stuff。 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,它指向了正确的文件夹。
所以我真的很困惑为什么它没有找到它们。
有任何想法吗?
谢谢
5个回答

15

所以我终于有点想通了,原来是...没有找到psapi.lib。

在项目->链接器->附加依赖项中,我不仅仅写了psapi.lib,而是给出了完整路径,然后它就可以工作了...不太确定之前为什么无法找到它,但没关系...


8
如果您正在使用MSVC编译器,可以在源代码中使用 #pragma comment(lib, "psapi.lib") 来添加该库。 - Billy ONeal

1
记录一下:同样的问题,不同的解决方案;我对目录进行了条目输入。
psapi 

在列表中添加
Linker/General/Additional Library Directory 

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

1
这可能是一个很长的猜测(我并不真的相信这就是原因),但也许头文件没有用 extern "C" 正确保护,以便进行 C++ 编译?你是否包含了系统头文件或只是自己声明函数?

你尝试过完全重建吗?我注意到VC++偶尔会“混淆”(可能会弄乱程序数据库),而完全重建通常会有所帮助。我建议提前删除所有的*.obj、*.exe和*.pdb文件,以防万一... - Tomek

1

你能发布一下你的编译和链接命令行,以及代码中的任何 #def 吗?

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


0
在我的情况下(从VS2008迁移到VS2012),在VS2012的链接器中添加psapi.libLinker->input->Additional Dependencies后,问题得到解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接