C++ TDM-GCC引发错误:未定义对我从未调用过的方法的引用
这是Dev-C++在Windows7上运行时附带的编译器“TDM-GCC4.9.2 64位版本”。64位版本也会发生同样的情况。“编译器选项”中的“调用链接器时添加以下标志”设置为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&
-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)声明了code>,但我在任何地方都找不到它的定义,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)