gpt4 book ai didi

c++ - MinGW,g++,winapi,winsdk,迷茫中

转载 作者:可可西里 更新时间:2023-11-01 13:57:16 25 4
gpt4 key购买 nike

我试图调用使用 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.dllEXPORTS    GetPhysicalCursorPos = __imp_GetPhysicalCursorPos

将其保存到名为 myuser32.def 的文件中。现在,这不是 user32 导出的所有函数,但我们只需要 mingw 附带的导入库中缺少的函数。

现在使用 dlltool 制作导入库:

>dlltool -d myuser32.def -l myuser32.a

然后通过导入库编译:

>g++ main.cpp myuser32.a -o main.exe

这次成功了。当我们运行程序时:

>main1302, 670

关于c++ - MinGW,g++,winapi,winsdk,迷茫中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20389408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com