C++ TDM-GCC引发错误:未定义对我从未调用过的方法的引用

C++ TDM-GCC引发错误:未定义对我从未调用过的方法的引用,c++,linker-errors,tdm-mingw,tdm-gcc,C++,Linker Errors,Tdm Mingw,Tdm Gcc,这是Dev-C++在Windows7上运行时附带的编译器“TDM-GCC4.9.2 64位版本”。64位版本也会发生同样的情况。“编译器选项”中的“调用链接器时添加以下标志”设置为-static libgcc-lws2_32,“调用编译器时添加以下标志”设置为std=c++11 不幸的是,我无法得到更多的信息,因为这是一台非常非常锁定的计算机 回到家后,我会在那里测试它,并编辑任何新信息 测试文件: #include <windows.h> #include <psapi.h&

这是Dev-C++在Windows7上运行时附带的编译器“TDM-GCC4.9.2 64位版本”。64位版本也会发生同样的情况。“编译器选项”中的“调用链接器时添加以下标志”设置为
-static libgcc-lws2_32
,“调用编译器时添加以下标志”设置为
std=c++11

不幸的是,我无法得到更多的信息,因为这是一台非常非常锁定的计算机

回到家后,我会在那里测试它,并编辑任何新信息

测试文件:

#include <windows.h>
#include <psapi.h>
#include <iostream>

int main() {
    HANDLE h = GetCurrentProcess();
    TCHAR name[100];
    GetProcessImageFileName(h, name, 100);
    std::cout << "Name is " << std::endl;
}
据我所知,它调用的是
GetProcessImageFileNameA
而不是
GetProcessImageFileName
,因为
psapi.h
中有一个
#define

#define GetProcessImageFileName __MINGW_NAME_AW(GetProcessImageFileName)
\uuu MINGW\u NAME_AW(func)
\unicode.h
中的
d定义为
func\35; A
,如果我理解正确,这就是新方法名称的来源

回到
psapi.h
DWORD-WINAPI-GetProcessImageFileNameA(HANDLE,LPSTR,DWORD),但我在任何地方都找不到它的定义,Dev-C++也找不到。我相当肯定这就是问题所在


我怎样才能修好它?我对任何事情都持开放态度,包括切换编译器或IDE,只要我能将我使用的任何东西放在闪存驱动器上,并尽可能轻松地随身携带,并且最终结果不需要管理员权限即可运行。

您需要将
Psapi.lib
Kernel32.lib
链接到您的项目中。我不确定您的编译器是否正确,但在VC++中,您可以将
#pragma comment(lib,“Psapi.lib”)
添加到代码中,或者将
Psapi.lib
添加到项目属性的其他库中


Sam是一个windows API函数,您需要链接到正确的库才能访问它

它被定义为一个宏,可以是
GetProcessImageFileNameA
GetProcessImageFileNameW
,具体取决于编译的是“宽”还是“窄”


Win32 API具有每个函数的Unicode和ascii版本(至少是采用字符串的函数)。通常,ascii版本将字符转换为Unicode,并在内部调用另一个字符

它的“定义”可以在导入库中找到,该库用于链接
kernel32.lib
中的所有其他内核Windows API函数。那么这个导入库wrt Dev-C++在哪里呢?(顺便说一句,它不是编译器,而是IDE)。我认为
-lws2_32
(因为它是GCC)会链接到适当的库。如果不是这样的话,我怎样才能知道该链接哪一个?是否为
-lpsapi
?MSDN为每个函数引用正确的.lib和.h。谷歌搜索应该为任何给定的Windows API函数找到正确的页面。在本例中,问题的第一句话是“这是在Windows 7上运行的Dev-C++附带的编译器“TDM-GCC 4.9.2 64位版本”P除此之外,有没有办法通过GCC命令行参数实现这一点?@QPaysTaxes是的,只需在命令末尾添加
-lpsapi
#define GetProcessImageFileName __MINGW_NAME_AW(GetProcessImageFileName)