TDM-GCC raises error: Undefined reference to a method I never called
TDM-GCC raises error: Undefined reference to a method I never called
这是Dev-C++自带的编译器,当运行 on Windows 7, "TDM-GCC 4.9.2 64-bit Release"。同样的事情也发生在 64 位版本上。 "Compiler Options"中的"add the following flags when calling the linker"设置为-static-libgcc -lws2_32
,"add the following flags when calling the compiler"为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;
}
编译时出现如下错误:
C:\Users\[REDACTED]\AppData\Local\Temp\ccQz3L9P.o:test.cpp:(.text+0x2f): undefined reference to `GetProcessImageFileNameA'
据我所知,它调用 GetProcessImageFileNameA
而不是 GetProcessImageFileName
因为 psapi.h
中的 #define
:
#define GetProcessImageFileName __MINGW_NAME_AW(GetProcessImageFileName)
__MINGW_NAME_AW(func)
在 _mingw_unicode.h
中是 #define
d 作为 func##A
,如果我理解正确的话,这就是新方法名称的来源。
回到psapi.h
,声明了DWORD WINAPI GetProcessImageFileNameA(HANDLE, LPSTR, DWORD);
,但我没有在任何地方找到它的定义,Dev-C++ 也找不到。我相当确定这就是问题所在。
我该如何解决?我对任何事情都持开放态度,包括切换编译器或 IDE,只要我可以将我使用的任何东西放在闪存驱动器上并尽可能少地随身携带,并且最终结果不需要管理员运行.
的特权
您需要 link Psapi.lib
或 Kernel32.lib
到您的项目中。我不确定您的编译器,但在 VC++ 中,您将 #pragma comment(lib, "Psapi.Lib")
添加到您的代码中,或者在其他项目属性库中添加 Psapi.lib
。
山姆
GetProcessImageFileName
是一个 windows API 函数,您需要 link 在正确的库中才能访问它。
它被定义为 GetProcessImageFileNameA
或 GetProcessImageFileNameW
的宏,具体取决于您编译的是 "wide" 还是 "narrow"。
Win32 API 每个函数都有 Unicode 和 ascii 版本(至少是接受字符串的函数)。一般情况下,ascii版本是将字符转成Unicode,内部调用其他植入。
这是Dev-C++自带的编译器,当运行 on Windows 7, "TDM-GCC 4.9.2 64-bit Release"。同样的事情也发生在 64 位版本上。 "Compiler Options"中的"add the following flags when calling the linker"设置为-static-libgcc -lws2_32
,"add the following flags when calling the compiler"为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;
}
编译时出现如下错误:
C:\Users\[REDACTED]\AppData\Local\Temp\ccQz3L9P.o:test.cpp:(.text+0x2f): undefined reference to `GetProcessImageFileNameA'
据我所知,它调用 GetProcessImageFileNameA
而不是 GetProcessImageFileName
因为 psapi.h
中的 #define
:
#define GetProcessImageFileName __MINGW_NAME_AW(GetProcessImageFileName)
__MINGW_NAME_AW(func)
在 _mingw_unicode.h
中是 #define
d 作为 func##A
,如果我理解正确的话,这就是新方法名称的来源。
回到psapi.h
,声明了DWORD WINAPI GetProcessImageFileNameA(HANDLE, LPSTR, DWORD);
,但我没有在任何地方找到它的定义,Dev-C++ 也找不到。我相当确定这就是问题所在。
我该如何解决?我对任何事情都持开放态度,包括切换编译器或 IDE,只要我可以将我使用的任何东西放在闪存驱动器上并尽可能少地随身携带,并且最终结果不需要管理员运行.
的特权您需要 link Psapi.lib
或 Kernel32.lib
到您的项目中。我不确定您的编译器,但在 VC++ 中,您将 #pragma comment(lib, "Psapi.Lib")
添加到您的代码中,或者在其他项目属性库中添加 Psapi.lib
。
山姆
GetProcessImageFileName
是一个 windows API 函数,您需要 link 在正确的库中才能访问它。
它被定义为 GetProcessImageFileNameA
或 GetProcessImageFileNameW
的宏,具体取决于您编译的是 "wide" 还是 "narrow"。
Win32 API 每个函数都有 Unicode 和 ascii 版本(至少是接受字符串的函数)。一般情况下,ascii版本是将字符转成Unicode,内部调用其他植入。