与MinGW(v.4.3.0)和libhid

时间:2018-03-28 15:23:28

标签: 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'

链接器命令是

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

如果我省略-lhid,我会收到同样的错误。如果我删除-lhid并明确将路径和文件名设置为libhid.a,我也会遇到相同的错误。如果我故意错误地输入路径和文件名,则会出现错误,因此我知道命令行正在被正确解析。但无论出于何种原因,MinGW似乎都没有链接到自己的库文件。

我也尝试删除-lsetupapi并且我得到了我期望的那些链接器错误。同样是Qt库文件。但似乎专门针对libhid.a,MinGW可以看到库文件但只是不会与它链接。

有没有人见过这个?或者,具有相同(或类似)版本的MinGW的其他人是否可以确认或否认他们可以与libhid.a链接?或者我正在做的事情有什么明显的错误吗?

1 个答案:

答案 0 :(得分:3)

我刚刚找到答案。我自己发布了一个答案,以便其他人知道,因为我认为这仍然是一个人们可能想知道的有效问题。

问题是包含文件hidsdi.h。拉入Win32 API调用的大多数其他头文件在函数声明周围都有extern "C"。不过这个没有!结果是我们最终得到链接器符号的C ++名称修改,而不是链接器符号前面的C样式“_”。

解决方案是使用

extern "C"
{
    #include <hidsdi.h>
}

然后一切正常。

hidsdi.h版本与旧版本的MinGW(我正在移植) 在功能声明周围有这种保护。然而,看起来它已经在新版本中消失了。