MinGW 4.3.0与libhid链接失败问题求助(Qt 5.9.3环境)
搞定MinGW 4.3.0链接HID库失败的问题
嘿,我来帮你捋捋这个链接报错的问题——Qt5.9.3自带的MinGW4.3.0确实有点年头了,很多新特性支持都跟不上,你的问题大概率出在这个老编译器上,而非Qt本身。咱们一步一步来排查:
1. 先补上缺失的系统库链接
Windows的HID相关API依赖setupapi.lib和hid.lib这两个系统库,老版本MinGW不会自动帮你链接它们,必须手动指定:
- 如果你用的是Qt的
.pro项目文件,直接加一行:LIBS += -lsetupapi -lhid - 要是用CMake的话,在目标链接里加上这两个库:
target_link_libraries(你的库名 setupapi hid)
2. 解决C++11 ABI不兼容的坑
报错里的B5cxx11后缀是关键!这说明你的代码用了C11的std::string(或者其他C11特性),但MinGW4.3.0是2009年的老版本,当时C11都还没正式发布,对C11的ABI支持一塌糊涂。你有两个选择:
- 要是代码没依赖太多C11特性,直接在
.pro里关掉C11:QMAKE_CXXFLAGS -= -std=c++11 -std=c++0x QMAKE_CFLAGS -= -std=c++11 -std=c++0x - 或者把
getDevicePath函数里返回的std::string换成C风格的char*,绕开C++11的ABI问题。
3. 检查函数签名和头文件是否正确
老MinGW的名字改编规则和新编译器不一样,如果HID相关函数的签名不对,也会导致找不到符号。你得确保:
- 头文件包含顺序正确,先定义宏避免冲突:
#define WIN32_LEAN_AND_MEAN #define NOMINMAX #include <windows.h> #include <hidsdi.h> #include <setupapi.h> - 调用的
HidD_GetHidGuid、SetupDiGetClassDevs这些函数的参数和返回值完全符合Windows API的定义,别自己瞎改签名。
4. 终极方案:换掉老掉牙的MinGW4.3.0
说实话,MinGW4.3.0真的太老了,很多现代Windows API的支持都有问题。Qt5.9.3其实可以兼容更新的32位MinGW版本,比如5.3.0或者7.3.0,你可以:
- 下载对应版本的32位MinGW
- 在Qt Creator里添加新的Kit,指向新的MinGW路径
- 重新编译项目,大部分老版本的兼容性问题都会直接消失
最后给你个小经验:链接阶段找不到符号,90%都是库没加对或者ABI不兼容,先从加库和检查C++标准这两点入手,大概率能快速解决问题。
内容的提问来源于stack exchange,提问作者Graham
相关产品推荐
相关产品推荐

