我试图调用使用 g++ (mingw) 编译的 GetPhysicalCusrorPos(),结果发现我的 sdk 已过时。所以我去下载了最新的带有最新 w32api 的 MinGW,但是标题中仍然缺少这个功能......所以我开始谷歌搜索以下问题,只是越来越迷失:
_ 当您想使用 Windows API 而使用 MinGW 时,w32api 是实现它的唯一好方法吗?
_ Windows API、windows SDK、w32api、MinGW 和 w32api 之间究竟是什么关系???
_ gnu 工具(MinGW、gcc、g++ 等)可以像 VisualC/WinSDK (cl.exe) 一样做吗???
请不要以为我没有寻找答案,我确实搜索过,但我发现的所有不同答案让我迷失的远多于它们对我的帮助。 如果有人能澄清所有这一切,那对像我这样迷路的初学者来说会非常好。
非常感谢!
最佳答案
据我了解,将MS SDK与mingw编译器一起使用是不切实际的。您必须使用特定于 mingw 的 SDK。甚至最新的 mingw 版本似乎也不支持 GetPhysicalCursorPos
。
由于您只需要这个功能,或者可能需要这个功能和其他一些功能,因此很容易自行提供 SDK 的缺失部分。例如:
#define WINVER 0x0600
#include <windows.h>
#include <iostream>
extern "C"
{
__declspec(dllimport) BOOL WINAPI GetPhysicalCursorPos(LPPOINT lpPoint);
}
int main()
{
POINT pt;
if (GetPhysicalCursorPos(&pt))
{
std::cout << pt.x << ", " << pt.y << std::endl;
}
}
这里我们包含了我们希望调用的 API 的声明。编译时会出现以下错误:
>g++ main.cpp -o main.exe >C:\Users\xxx\AppData\Local\Temp\ccCCZZEk.o:main.cpp:(.text+0x1d): undefined reference to `__imp_GetPhysicalCursorPos' collect2.exe: error: ld returned 1 exit status
所以我们需要想办法让链接器能够解析符号。理论上,您可以要求链接器 ld 直接链接到 DLL。但我一直无法让它发挥作用。相反,您可以使用更费力的方法。
制作一个 .def 文件来定义此函数所在的 user32 库的导出:
LIBRARY user32.dll EXPORTS GetPhysicalCursorPos = __imp_GetPhysicalCursorPos
将其保存到名为 myuser32.def 的文件中。现在,这不是 user32 导出的所有函数,但我们只需要 mingw 附带的导入库中缺少的函数。
现在使用 dlltool 制作导入库:
>dlltool -d myuser32.def -l myuser32.a
然后通过导入库编译:
>g++ main.cpp myuser32.a -o main.exe
这次成功了。当我们运行程序时:
>main 1302, 670
关于c++ - MinGW,g++,winapi,winsdk,迷茫中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20389408/