Windows下CMake构建Makefile时libusb链接错误排查求助
解决Windows MinGW环境下libusb链接未定义引用问题
问题分析
你遇到的undefined reference错误是链接器找不到libusb函数的实现代码,核心原因是当前配置的.dll.a是导入库,必须配套同名的libusb-1.0.dll才能工作,但你只有MSYS版本的msys-usb-1.0.dll,同时CMake未正确关联到可用的libusb库文件。
快速解决步骤
1. 切换到静态库链接(最稳妥方案)
静态库libusb-1.0.a包含了libusb的全部代码,编译时会直接打包进你的程序,无需依赖外部DLL:
- 打开CMake GUI,点击
File -> Delete Cache清空旧配置缓存 - 在CMake变量列表中找到
LIBUSB_1_LIBRARY,将其值改为libusb-MinGW/lib目录下的libusb-1.0.a - 确认
LIBUSB_1_INCLUDE_DIR指向libusb-MinGW/include/libusb-1.0目录 - 点击
Configure,选择MinGW Makefiles(注意选MinGW原生版本,不是MSYS的),配置完成后点击Generate重新生成Makefile
2. 重新编译
打开MinGW终端(不要用MSYS终端),进入你的构建目录,执行命令:
make clean make
备选方案:适配现有DLL(若需动态链接)
如果你坚持用动态链接,可按以下操作:
- 找到
libusb-MinGW/bin下的msys-usb-1.0.dll,复制一份并重命名为libusb-1.0.dll - 将改名后的DLL放到两个位置:项目构建目录、MinGW的
bin目录(如C:\mingw64\bin) - 回到CMake GUI,将
LIBUSB_1_LIBRARY设置为libusb-MinGW/lib下的libusb-1.0.dll.a,重复上述配置、生成、编译步骤
你遇到的错误信息参考
C:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\freenect.dir/objects.a(tilt.c.obj):tilt.c:(.text+0x4b): undefined reference to `libusb_bulk_transfer' C:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\freenect.dir/objects.a(tilt.c.obj):tilt.c:(.text+0xbf): undefined reference to `libusb_error_name' C:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\freenect.dir/objects.a(tilt.c.obj):tilt.c:(.text+0x1cc): undefined reference to `libusb_bulk_transfer'
内容的提问来源于stack exchange,提问作者hugo
相关产品推荐
相关产品推荐

