【问题标题】:How would I include Psapi.h without running into a multiply included error?我如何包含 Psapi.h 而不会遇到多重包含错误?
【发布时间】:2018-01-11 14:28:13
【问题描述】:

目前遇到的问题是 Winsock.h 已包含在我项目其他地方的头文件中...

标题不直接包含:

# if defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_)
# error WinSock.h has already been included
# endif // defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_)

所以当我尝试构建时,我收到错误“C1189 Winsock.h 已包含”(来自上述代码中定义的错误消息)。

但是,我需要能够使用parts of the PSAPI 来获取有关当前进程的内存使用信息。我试图包含在我的其他文件中...

我的 .cpp 文件:

#include <Windows.h>
#include <Psapi.h>

...

SIZE_T getMemoryInfo() {    // The function that needs the includes

    PROCESS_MEMORY_COUNTERS pmc;
    SIZE_T memoryUsed;

    GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
    memoryUsed = pmc.WorkingSetSize;

    return memoryUsed;

}

在研究之后,我尝试使用 WIN32_LEAN_AND_MEAN 来尝试摆脱 Winsock.h 包含,它有效,但现在当我尝试使用 PROCESS_MEMORY COUNTERS 时,我得到一个未定义的符号错误......

“函数中引用的 LNK2019 未解析的外部符号 GetProcessMemoryInfo...”和“LNK1120 1 未解析的外部符号 [in myFile]”

我希望我需要弄清楚如何包含我需要的实际头文件,but the Windows docs do not say(并且Wikipedia 表示大多数子头文件不能单独包含,所以这可能是一个问题)。

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>    // Windows specific libraries for collecting software metrics.
#include <Psapi.h>

我一整天都在试图解决这个问题,任何帮助都将不胜感激,因为 Windows Docs 非常无用,我感到非常沮丧。如果这是一个愚蠢的问题,我深表歉意,但我经常为包含问题而苦恼。

【问题讨论】:

  • 不要混淆编译器和链接器错误,这是完全不同的事情。 LNK2019 for GetProcessMemoryInfo 说你不包括Psapi.lib 或者使用旧的sdk
  • @RbMm +1 因为我认为你走在正确的轨道上。但是,恐怕“你不 include Psapi.lib”是不好的(或者我应该说“不幸”)措辞...... ;-)
  • 对不起,我是在开玩笑。 RbMm 指出您收到 link 错误。拼写出来:您的#includes 可能没问题,您也可以使用#define WIN32_LEAN_AND_MEAN 进行修复。如果出现链接错误,请检查 lib 文件Psapi.lib 是否在库依赖项中。如果是,它可能是旧版本... ...您需要更新的 SDK 才能使用它。
  • 您有GetProcessMemoryInfo 说您使用PSAPI_VERSION==1(否则将使用K32GetProcessMemoryInfo 名称)。 GetProcessMemoryInfo 仅存在于 psapi.lib 中,您需要将其包含为链接器输入
  • 如果你包含psapi.lib - 你永远不会收到关于未解决的GetProcessMemoryInfoK32GetProcessMemoryInfo 的错误(inpedend from version)

标签: c++ windows include psapi


【解决方案1】:

终于明白了。

显然 psapi.lib 并没有被 Visual Studio 自动链接到(尽管 Windows util 库是...)。您必须进入属性/链接器/输入并手动将库添加为依赖项。如果找不到库位置,请在 C/C++ 中手动添加目录作为搜索目录。

您还必须有#define WIN32_LEAN_AND_MEAN。

希望对您有所帮助,如果将来有人需要帮助,请在此处发表评论。

感谢@RbMn 和@Scheff,感谢大家!

【讨论】:

  • 不过,你解决了它。你知道你可以accept your own answer吗? (它会在 48 小时后激活。)
  • 是的@Scheff,得先再等几天。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 2015-12-22
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多