【问题标题】:g++ cannot find reference to GetModuleInformation on Windowsg++ 在 Windows 上找不到对 GetModuleInformation 的引用
【发布时间】:2021-04-05 04:09:21
【问题描述】:

我正在 Windows (MinGW) 上用 g++ 编译和链接 C++ 程序 编译命令如下:

g++ -c file.cpp -o file.o

链接命令如下:

g++ -L. -lPsapi -o file.exe file.o

我在. 目录中有一个名为Psapi.lib 的文件(我从Windows SKD 目录复制了它),但它仍然找不到GetModuleInformation 的引用

PS.:GetModuleInformation Fails on Linkage in Windows 10 没有帮助

【问题讨论】:

  • 将库从安装位置复制到您的项目目录是一个非常糟糕的主意。如果您的系统更新该库怎么办?然后你仍然会使用旧版本。如果它不再与您更新的计算机兼容怎么办。而是告诉编译器库在哪里。在 MinGW 上,这意味着使用 -L 选项。

标签: c++ windows gcc linker g++


【解决方案1】:

您很可能需要: (a) 定义 PSAPI_VERSION 令牌(到 1);或 (b) 通过其“新”名称 K32GetModuleInformation() 调用该函数。

来自documentation

如果 PSAPI_VERSION 为 2 或更大,则此函数定义为 Psapi.h 中的 K32GetModuleInformation 并在 Kernel32.lib 中导出 内核 32.dll。如果 PSAPI_VERSION 为 1,则此函数定义为 Psapi.h 中的 K32GetModuleInformation 并在 Psapi.lib 中导出 Psapi.dll 作为调用 K32GetModuleInformation 的包装器。

必须在早期版本的 Windows 上运行的程序以及 Windows 7 及更高版本应始终将此函数称为 K32GetModuleInformation。为了确保符号的正确分辨率,添加 Psapi.lib 到 TARGETLIBS 宏并编译程序 -DPSAPI_VERSION=1。要使用运行时动态链接,请加载 Psapi.dll。

【讨论】:

  • 所以,我添加了#define PSAPI_VERSION 2,包括Windows.h,然后是Psapi.h,并尝试调用K32GetModuleInformation而不是GetModuleInformation,现在我得到'K32GetModuleInformation' was not declared in this scope; did you mean 'GetModuleInformation'
  • @CredixYt 那么您的库和/或编译器配置可能存在问题。在较新的 Windows 操作系统版本中使用第三方编译器/链接器通常很棘手。
  • 这尤其具有挑战性,因为我们甚至不知道您使用的是哪个工具链。 MinGW 有两种版本:一种是过时的 32 位版本,另一种是不太过时的 64 位版本。
  • 我刚刚检查了一下,我的 MinGW 安装目录有一个名为 mingw32 的文件夹,bin 中的一些文件以 mingw32- 为前缀,所以我假设它是 32 位安装。您认为安装 64 位版本会有所帮助吗?我正在 64 位操作系统上编译和链接 32 位二进制文​​件,这就是我首先安装 32 位版本的原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 2011-10-16
  • 2015-01-16
相关资源
最近更新 更多