【问题标题】:MinGW, g++, winapi, winsdk, lost in confusionMinGW、g++、winapi、winsdk、迷茫
【发布时间】:2023-03-04 09:10:01
【问题描述】:

我试图调用使用 g++ (mingw) 编译的 GetPhysicalCusrorPos(),结果发现我的 sdk 已过时。所以我去下载了最后一个带有最新 w32api 的 MinGW,但是标题中仍然缺少这个功能......所以我开始在谷歌上搜索以下问题,只是越来越迷失:

_ 当您想使用 Windows API 但使用 MinGW 时,w32api 是实现它的唯一方法吗?

_windows API、windows SDK、w32api、MinGW和w32api到底是什么关系???

_gnu 工具(MinGW so gcc, g++ 等)可以和 VisualC/WinSDK (cl.exe) 一样吗???

请不要以为我没有寻找答案,我确实做到了,但我找到的所有不同答案让我失去的比他们帮助我的更多。 如果有人能澄清这一切,对于像我这样迷失的初学者来说,这将是非常好的。

非常感谢!

【问题讨论】:

  • 节省一些时间,使用 Visual c++ 和 windows sdk 进行 windows 开发
  • 我正在开发一些插件并且包含运行时不是一个选项,我认为如果你编译你需要包含它们。或者有没有办法不必包含它们?
  • 我找到了我对上一条评论的答案(无需重新编辑即可编译)@linklink(显然是的)

标签: c++ windows winapi mingw


【解决方案1】:

据我了解,将 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): 未定义 引用`__imp_GetPhysicalCursorPos' collect2.exe:错误:ld 返回 1 退出状态

所以我们需要找到一种方法让链接器能够解析符号。理论上,您可以要求链接器 ld 直接链接到 DLL。但我无法让它发挥作用。相反,您可以使用更费力的方法。

制作一个 .def 文件来定义该函数所在的 user32 库的导出:

库 user32.dll 出口 GetPhysicalCursorPos = __imp_GetPhysicalCursorPos

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

现在使用 dlltool 制作一个导入库:

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

然后通过导入库编译:

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

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

>主要 1302, 670

【讨论】:

    猜你喜欢
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    相关资源
    最近更新 更多