You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Windows HID API构建HID USB客户端遇链接符号缺失问题

Windows HID API 链接器符号未找到问题

在Windows系统下开发HID USB设备通信程序,因无法使用libusb改用Windows HID API,但构建时链接器无法找到HidD_GetPreparsedData、HidP_GetCaps等函数符号,已确认本地存在对应库文件。

Makefile内容

CXX := g++
CXXFLAGS := -Wall -Wextra -std=c++11
LIBS := -L"C:/Program Files (x86)/Windows Kits/10/Lib/10.0.22000.0/um/x64" -lhid
SOURCES := main.cpp 
OBJECTS := $(SOURCES:.cpp=.o)
EXECUTABLE := myprogram
$(EXECUTABLE): $(OBJECTS)
    $(CXX) $(CXXFLAGS) $(INCLUDES) -o $@ $^ $(LIBS)

%.o: %.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

clean:
    rm -f $(OBJECTS) $(EXECUTABLE)

测试程序代码

#include <iostream>
#include <Windows.h>
#include <hidsdi.h>
#include <hidpi.h>

int main() {
    HANDLE device_handle = nullptr;
    PHIDP_PREPARSED_DATA preparsed_data = nullptr;
// 先注释掉编译错误,优先解决链接错误...
//    device_handle = CreateFile(L"\\\\.\\HID_DEVICE_NAME", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nullptr);
    if (device_handle != INVALID_HANDLE_VALUE) {
        if (HidD_GetPreparsedData(device_handle, &preparsed_data)) {
            HIDP_CAPS capabilities;
            if (HidP_GetCaps(preparsed_data, &capabilities) == HIDP_STATUS_SUCCESS) {
                USHORT value_caps_length = capabilities.NumberInputValueCaps;
                PHIDP_VALUE_CAPS value_caps = new HIDP_VALUE_CAPS[value_caps_length];

                if (HidP_GetValueCaps(HidP_Input, value_caps, &value_caps_length, preparsed_data) == HIDP_STATUS_SUCCESS) {
                    for (USHORT i = 0; i < value_caps_length; ++i) {
                        std::cout << "Value Capabilities " << i << ":" << std::endl;
                        std::cout << "Usage Page: " << value_caps[i].UsagePage << std::endl;
                        std::cout << "Report ID: " << value_caps[i].ReportID << std::endl;
                        std::cout << "Bit Field: " << value_caps[i].BitField << std::endl;
                        std::cout << "Logical Minimum: " << value_caps[i].LogicalMin << std::endl;
                        std::cout << "Logical Maximum: " << value_caps[i].LogicalMax << std::endl;
                        std::cout << "Physical Minimum: " << value_caps[i].PhysicalMin << std::endl;
                        std::cout << "Physical Maximum: " << value_caps[i].PhysicalMax << std::endl;
                        std::cout << "Units: " << value_caps[i].Units << std::endl;
                        std::cout << "Units Exp: " << value_caps[i].UnitsExp << std::endl;
                        std::cout << "Is Absolute: " << (value_caps[i].IsAbsolute ? "true" : "false") << std::endl;
                    }
                }

                delete[] value_caps;
            }

            HidD_FreePreparsedData(preparsed_data);
        }

        CloseHandle(device_handle);
    }

    return 0;
}

构建错误信息

C:\Users\piffo\go\src\tassta.com\work_with_usb\3>make g++ -Wall -Wextra -std=c++11  -o myprogram main.o -L"C:/Program Files (x86)/Windows Kits/10/Lib/10.0.22000.0/um/x64" -lhid  

C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe:
main.o:main.cpp:(.text+0x37): undefined reference to `HidD_GetPreparsedData(void*, _HIDP_PREPARSED_DATA**)'

C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe:
main.o:main.cpp:(.text+0x54): undefined reference to `HidP_GetCaps(_HIDP_PREPARSED_DATA*, _HIDP_CAPS*)'

C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe:
main.o:main.cpp:(.text+0xbb): undefined reference to `HidP_GetValueCaps(_HIDP_REPORT_TYPE, _HIDP_VALUE_CAPS*, unsigned short*, _HIDP_PREPARSED_DATA*)'

C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe:
main.o:main.cpp:(.text+0x4c3): undefined reference to `HidD_FreePreparsedData(_HIDP_PREPARSED_DATA*)'
collect2.exe: error: ld returned 1 exit status
make: *** [Makefile:8: myprogram] Error 1

解决方法

  • 补充库依赖:Windows HID API的函数分属两个库:hid.lib提供HidD_*系列函数,hidparse.lib提供HidP_*系列函数。修改Makefile的LIBS行,添加hidparse库:
    LIBS := -L"C:/Program Files (x86)/Windows Kits/10/Lib/10.0.22000.0/um/x64" -lhid -lhidparse
    
  • 匹配库架构与版本:确认Windows Kits的版本(10.0.22000.0)和架构(x64)与编译器目标一致,当前x64库路径符合64位程序编译需求。
  • 启用正确API版本:在代码中或编译参数里定义_WIN32_WINNT宏,确保函数声明被正确包含:
    • 代码中添加:
      #define _WIN32_WINNT 0x0A00 // 对应Windows 10
      #include <Windows.h>
      
    • 或在Makefile的CXXFLAGS中添加:
      CXXFLAGS := -Wall -Wextra -std=c++11 -D_WIN32_WINNT=0x0A00
      

内容的提问来源于stack exchange,提问作者Roman Kazmin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 06:52:03