【问题标题】:Problems linking with MinGW (v.4.3.0) and libhid与 MinGW (v.4.3.0) 和 libhid 链接的问题
【发布时间】:2018-09-07 08:49:57
【问题描述】:

上下文:我在 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 链接吗?还是我所做的事情明显有问题?

【问题讨论】:

  • MinGW 库的路径是什么?路径中有空格吗?
  • @MihaylA.A 该路径在默认的 Qt 安装目录中,为 C:\Qt\Qt5.9.3\Tools\mingw530_32\bin。里面没有空格。 (是的,我过去也被那个咬过!:)

标签: c++ qt gcc mingw hid


【解决方案1】:

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

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

解决办法是用

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

然后一切正常。

hidsdi.h 的版本和旧版本的 MinGW(我从中移植)确实在函数声明周围有这种保护。但是,它似乎在较新的版本中消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多