上下文:我在 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
链接?还是我正在做的事情明显有问题?
最佳答案
我刚刚找到了答案。我自己发布了一个答案,以便其他人将来知道,因为我认为这仍然是人们可能想知道的有效问题。
问题是包含文件 hidsdi.h
。引入 Win32 API 调用的大多数其他头文件在函数声明周围都有 extern "C"
。然而这个没有!结果是我们最终使用链接器符号的 C++ 名称重整,而不是链接器符号前面的 C 风格“_”。
解决方案是使用
extern "C"
{
#include <hidsdi.h>
}
然后一切正常。
hidsdi.h
与较早版本的 MinGW(我正在从中移植)的版本确实围绕着函数声明。但是它在新版本中似乎已经消失了。
关于c++ - 与 MinGW (v.4.3.0) 和 libhid 的链接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49536214/