MinGW,g ++,winapi,winsdk,迷茫迷失

 手机用户2502937013 发布于 2023-02-12 18:45

我试图用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)一样吗???

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

非常感谢 !

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): 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
    

    2023-02-12 18:46 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有