c++ - 与 MinGW (v.4.3.0) 和 libhid 的链接问题

标签 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 链接?还是我正在做的事情明显有问题?

最佳答案

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

问题是包含文件 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/

相关文章:

c++ - 匹配数学表达式的正则表达式

c++ - 关闭按钮仅适用于 Qt 中的某些选项卡

visual-c++ - 在 Windows 中用 C 计算百分比

c++ - 在多线程环境中使用Mysql++的问题

c++ - 为什么这个正则表达式会抛出异常?

c++ - 将递增/递减运算符放在三元/条件运算符中是否安全?

c++ - 发生缓冲区溢出

c++ - 在 Qt Stickman 示例中将火柴人的头像更改为我教授的头像

linux - 用于简单 C 程序的 Sublime text linux gcc 构建

c - '-c' 选项在 GCC 中有什么作用?