使用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
相关产品推荐
相关产品推荐

