上下文:我在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
链接?或者我正在做的事情有什么明显的错误吗?
答案 0 :(得分:3)
我刚刚找到答案。我自己发布了一个答案,以便其他人知道,因为我认为这仍然是一个人们可能想知道的有效问题。
问题是包含文件hidsdi.h
。拉入Win32 API调用的大多数其他头文件在函数声明周围都有extern "C"
。不过这个没有!结果是我们最终得到链接器符号的C ++名称修改,而不是链接器符号前面的C样式“_”。
解决方案是使用
extern "C"
{
#include <hidsdi.h>
}
然后一切正常。
hidsdi.h
版本与旧版本的MinGW(我正在移植) 在功能声明周围有这种保护。然而,看起来它已经在新版本中消失了。