从MinGW32升级到MinGW64时-lhid链接选项失效问题求助
嘿,我碰到过类似的问题,给你捋捋怎么解决:
首先看你的代码和编译命令,你调用了HidD_GetHidGuid这个HID相关函数,用-lhid链接的时候应该是报了“未定义引用”的错误对吧?
先贴下你的代码方便参考:
#include <windows.h> #include <hidsdi.h> int main(int argc, char * argv[]) { GUID guidHID; HidD_GetHidGuid(&guidHID); return 0; }
还有你的控制台输出(应该后面跟着链接错误信息):
C:\Users[...]>where g++
C:\mingw-w64-7.3.0\i686-7.3.0-posix-dwarf-rt_v5-rev0\mingw32\bin\g++.exeC:\Users[...]>g++ test.cc -lhid
C:\Users[...]\AppData\Local\Temp\ccXXXXXX.o:test.cc:(.text+0x17): undefined reference to `_imp__HidD_GetHidGuid@4'
collect2.exe: error: ld returned 1 exit status
问题核心在于MinGW64下HID相关的API实际是在setupapi库中,而不是单独的hid库。你之前用MinGW32的时候可能习惯了-lhid,但MinGW-w64的库映射逻辑不一样——HidD_GetHidGuid的实现是在系统的setupapi.dll里,所以链接时需要指定setupapi库。
直接修改编译命令就能解决:
g++ test.cc -lsetupapi
你可以验证下,去你的MinGW64库目录(比如C:\mingw-w64-7.3.0\i686-7.3.0-posix-dwarf-rt_v5-rev0\mingw32\lib)里找,肯定能看到libsetupapi.a,这就是MinGW对应的静态导入库,链接它就能找到HID相关的函数了。
另外提一句,不管你用的是32位(i686)还是64位(x86_64)的MinGW-w64,这个库依赖都是一样的,不用纠结位数,只要用-lsetupapi就对了。
内容的提问来源于stack exchange,提问作者whobbes

