MinGW编译C++代码时GetProcessImageFileName未定义引用错误原因
通过PID获取可执行文件路径编译报错:
GetProcessImageFileName未声明 问题背景
使用g++ (MinGW.org GCC-6.3.0-1)编译代码时出现以下错误:
..\src\Test.cpp:15:61: error: 'GetProcessImageFileName' was not declared in this scope
待编译代码
#define _WIN32_WINNT 0x0501 #include <windows.h> #include <process.h> #include <string> #include <iostream> using namespace std; string getProcessName(unsigned long pid) { string name = ""; TCHAR processPath[MAX_PATH] = { 0 }; DWORD len = MAX_PATH; HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid ); int rc = GetProcessImageFileName(hProcess, processPath, len); if(rc > 0) { // GET STRING HERE } CloseHandle(hProcess); return name; }
错误原因
缺少PSAPI头文件
GetProcessImageFileName属于Windows的Process Status API(PSAPI),你使用的旧版MinGW中,该函数的声明并未包含在默认的windows.h里,必须显式引入psapi.h才能让编译器识别。宏定义生效逻辑问题
虽然你定义了_WIN32_WINNT 0x0501,但该宏需要在所有Windows相关头文件之前定义才能触发GetProcessImageFileName的条件编译声明,若顺序不对也会导致函数未被识别。未链接PSAPI库
即便解决了编译声明问题,后续链接阶段还需要关联psapi库,否则会出现链接错误。
解决方法
步骤1:修改代码
添加psapi.h头文件,确保宏定义顺序正确,并增加句柄有效性检查:
#define _WIN32_WINNT 0x0501 #include <windows.h> #include <psapi.h> // 新增:引入PSAPI头文件 #include <process.h> #include <string> #include <iostream> using namespace std; string getProcessName(unsigned long pid) { string name = ""; TCHAR processPath[MAX_PATH] = { 0 }; DWORD len = MAX_PATH; HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid); if (hProcess != NULL) { // 新增:检查句柄是否有效,避免空指针调用 DWORD rc = GetProcessImageFileName(hProcess, processPath, len); if (rc > 0) { // 根据字符集转换路径到string #ifdef UNICODE char buffer[MAX_PATH]; WideCharToMultiByte(CP_ACP, 0, processPath, -1, buffer, MAX_PATH, NULL, NULL); name = buffer; #else name = processPath; #endif } CloseHandle(hProcess); } return name; }
步骤2:编译时链接库
使用以下命令编译代码,确保链接psapi库:
g++ Test.cpp -o Test.exe -lpsapi
内容的提问来源于stack exchange,提问作者joseph lake
相关产品推荐
相关产品推荐

