Gra*_*ham 1 c++ qt gcc mingw hid
上下文:我在 Windows 上使用 Qt 5.9.3,为 MinGW 32 位构建。Qt 部分是一个附带问题 - 问题似乎出在 MinGW 上。MinGW 的版本是 4.3.0,作为 Qt 安装的一部分预构建。
我正在构建一个通过 HID 与 USB 设备通信的库。一切都编译得很好,但在链接阶段失败了
./..\..\object\debug\usb_hid_device.o: In function `ZN8MyApp3USB5Win3213getDevicePathB5cxx11Ell':
<MYPATH>/../../source/win32/usb_hid_device.cpp:99: undefined reference to `HidD_GetAttributes(void*, _HIDD_ATTRIBUTES*)@8'
./..\..\object\debug\usb_hid_device.o: In function `ZN8MyApp3USB5Win3214CHIDDeviceImplC2EllRNS_15LogPerComponentE':
<MYPATH>/../../source/win32/usb_hid_device.cpp:200: undefined reference to `HidD_FlushQueue(void*)@4'
Run Code Online (Sandbox Code Playgroud)
链接器命令是
g++ -shared -mthreads -Wl,-subsystem,windows -Wl,--out-implib,<MYPATH>\bin\debug\libusb_hid_comms.a -o <MYPATH>\bin\debug\usb_hid_comms.dll object_script.usb_hid_comms.Debug -lhid -lsetupapi -LC:\Qt\Qt5.9.3\5.9.3\mingw53_32\lib C:\Qt\Qt5.9.3\5.9.3\mingw53_32\lib\libQt5Guid.a C:\Qt\Qt5.9.3\5.9.3\mingw53_32\lib\libQt5Cored.a
Run Code Online (Sandbox Code Playgroud)
如果我省略,-lhid
我会得到同样的错误。如果我删除-lhid
路径和文件名并将其显式设置为libhid.a
. 如果我故意输入错误的路径和文件名,则会出现错误,因此我知道命令行已正确解析。但无论出于何种原因,MinGW 似乎没有链接到它自己的库文件之一。
我还尝试删除-lsetupapi
,并得到了我期望的链接器错误,其中定义的函数。Qt 库文件也是如此。不过好像是专门为了libhid.a
,MinGW 可以看到库文件,但不会与其链接。
还有其他人看过这个吗?或者拥有相同(或相似)版本 MinGW 的其他人可以确认或否认他们可以链接吗libhid.a
?或者我正在做的事情明显有问题吗?
我刚刚找到了答案。我自己发布一个答案,以便其他人将来知道,因为我认为这仍然是一个人们可能想知道的有效问题。
问题是包含文件hidsdi.h
。大多数引入 Win32 API 调用的其他头文件都extern "C"
围绕函数声明。然而这个没有!结果是我们最终得到链接器符号的 C++ 名称重整,而不是链接器符号前面的 C 样式“_”。
解决方案是使用
extern "C"
{
#include <hidsdi.h>
}
Run Code Online (Sandbox Code Playgroud)
然后一切正常。
hidsdi.h
旧版本 MinGW(我从中移植)的版本确实对函数声明进行了保护。不过在新版本中似乎已经消失了。