我现在已经与 cmake 搏斗了好几个小时,但我现在正在用它来构建 make 文件,但我正在努力让 make 命令正常工作。我相信这是我的 libusb 链接的问题,但我很无能。我在 Windows 上使用 cmake GUI。我将提供我的配置的屏幕截图我相信这些都是它们应该与LIBUSB_1_LIBRARY分开的方式,我认为它不是一个实际的.dll文件(它是一个.dll.a),但我找不到libusb -1.0.dll 任何地方。在我的 libusb-MinGW/lib 文件夹中,我有
libusb-1.0.a
、libusb-1.0.dll.a
和 libusb-1.0.la
我还有一个包含 libusb-1.0.pc
的 pkgconfig 文件,所以我不确定是否存在正确的文件。 libusb-MinGW/bin 文件夹中还有一个名为 msys-usb-1.0.dll
的 dll 文件,它是我能找到的唯一 .dll 文件,所以也许就是我不确定的那个文件。如果这是一个非常微不足道的问题,我提前道歉,但我对与 C 相关的任何东西都很陌生,我真的只有 python 和 java 经验,所以这对我来说是非常未知的领域,而且似乎没有太多关于如何操作的文档除了 github 页面之外安装 libfreekinect,但我已经看了很多年了,但我没有从中得到任何东西。
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'
我有同样的问题(使用MSYS64)
我已经从源码 libusb(1.0) 构建了这样的
cd libusb
./configure --prefix /usr/local
make -j4
make install
我可以在/usr/local/lib
中看到文件并且在*/usr/local/lib/pkgconfig/libusb-1.0.pc中有一个.pc文件
所以 - 我去创建一个项目,不必要链接到这个库
cd Dev
mkdir TestCm && cd TestCm
在其中我放置了一个“Hello.world”C 文件..没有其他任何东西。
然后我创建一个 CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
project(TT)
set(SOURCE hello.c)
add_executable(T ${SOURCE})
include(FindPkgConfig)
pkg_checK_modules(USB libusb-1.0)
if (USB_FOUND)
message(STATUS "libusb-1.0 was found")
target_link_libraries(T ${USB_LIBRARIES})
else()
message(WARNING "libusb-1.0 was not found")
endif()
所以构建它......
mkdir build && cd build
cmake ../
我看到信息消息libusb-1.0 已找到。
现在编译
make VERBOSE=1
我得到一个错误
-lusb-1.0: No such library or directory
我手动检查/usr/local/lib/pkgconfig/linusb-1.0.pc
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: libusb-1.0
Description: C API for USB device access from Linux, Mac OS X, Windows, OpenBSD/NetBSD and Solaris userspace
Version: 1.0.26
Libs: -L${libdir} -lusb-1.0
Libs.private: -Wl,
Cflags: -I${includedir}/libusb-1.0
这看起来不错。然而,链接中缺少 -L{$libdir} ...
我使用 ccmake 仔细检查了这一点..
切换到高级模式(按t),然后滚动到底部,我找到了pkg_config_lib_USB_libusb-1.0,它指向另一个目录(/mingw64/lib/linusb-1.0.a)
CMake 现在更改为
cmake_minimum_required(VERSION 3.15)
project(TT)
set(SOURCE hello.c)
add_executable(T ${SOURCE})
include(FindPkgConfig)
pkg_checK_modules(USB libusb-1.0)
if (USB_FOUND)
message(STATUS "libusb-1.0 was found")
# target_link_libraries(T ${USB_LIBRARIES})
target_link_libraries(T ${pkg_config_lib_USB_libusb-1.0})
else()
message(WARNING "libusb-1.0 was not found")
endif()
所以
cmake ../
make VERBOSE=1
现在可以正确构建了。
我希望这可以帮助您找到问题。