我正在尝试构建 logger1,它通过 ElasticFusion从Kinect收集数据以进行离线SLAM。我正在Windows上构建。我尝试使用VS10为x64构建(我也有VS12,但某些依赖项预配置为VS10,所以为了保持简单,我使用它)。我使用的是CMake 3.9.0。
我已经解决了大部分依赖关系,但libusb让我很困扰。
我从CMake获得以下输出:
通常情况下,此时CMake GUI会显示一些新的配置变量,用红色表示包含和库路径,并带有一些无法使用的默认值,例如
但是,在
我已经下载了预构建的
在稍微探索一下之后,我在Logger1的
我随后重新进入CMake并按Configure,结果所有我放在中的内容都被删除了,然后抱怨找不到库(当然)。
我从未在自己的项目中使用过CMake,所以其中的问题远超出了我的有限熟悉范围。
我该如何让CMake识别我拥有的libusb文件?
我已经解决了大部分依赖关系,但libusb让我很困扰。
我从CMake获得以下输出:
...
Checking for module 'libusb-1.0'
No package 'libusb-1.0' found
CMake Error at C:/Program Files/CMake/share/cmake-3.9/Modules/FindPkgConfig.cmake:412 (message):
A required package was not found
Call Stack (most recent call first):
C:/Program Files/CMake/share/cmake-3.9/Modules/FindPkgConfig.cmake:588 (_pkg_check_modules_internal)
CMakeLists.txt:12 (pkg_check_modules)
通常情况下,此时CMake GUI会显示一些新的配置变量,用红色表示包含和库路径,并带有一些无法使用的默认值,例如
ZLIB_INCLUDE_DIR-NOTFOUND
,然后我需要将其更改为实际路径并重新运行Configure。但是,在
libusb-1.0
的情况下,GUI中没有给出任何新的配置变量。我已经选中了高级复选框,但所需的变量仍未显示。我已经下载了预构建的
libusb-1.0.21
,但是CMake不可避免地找不到它;这不是*nix,其中库路径是明确定义的。对于这些事情,我在文件服务器上有自己的目录结构,因此除非它询问我它们在哪里,否则CMake绝对无法找到它们,在这种情况下它没有这样做。在稍微探索一下之后,我在Logger1的
CMakeLists.txt
中发现了一些引用,如下所示:find_package(PkgConfig)
pkg_check_modules(libusb-1.0 REQUIRED libusb-1.0)
...
target_link_libraries(Logger
...other libraries...
${libusb-1.0_LIBRARIES})
所以,它提到需要libusb,但没有说明如何找到它。
CMakeCache.txt
文件中也提到了libusb。该文件显示了一些看起来相关但被标记为INTERNAL
的配置变量,这就解释了为什么我在GUI中没有看到它们。除了__pkg_config_checked_libusb-1.0
之外,所有这些变量的值都为空。
我尝试在合适的地方设置它们,如下所示:
__pkg_config_checked_libusb-1.0:INTERNAL=1
libusb-1.0_CFLAGS:INTERNAL=
libusb-1.0_CFLAGS_I:INTERNAL=
libusb-1.0_CFLAGS_OTHER:INTERNAL=
libusb-1.0_FOUND:INTERNAL=
libusb-1.0_INCLUDEDIR:INTERNAL=N:/3p-build/libusb/1.0.21/prebuilt/include/libusb-1.0
libusb-1.0_LIBDIR:INTERNAL=N:/3p-build/libusb/1.0.21/prebuilt/MS64/dll
libusb-1.0_LIBS:INTERNAL=N:/3p-build/libusb/1.0.21/prebuilt/MS64/dll/libusb-1.0.lib
libusb-1.0_LIBS_L:INTERNAL=
libusb-1.0_LIBS_OTHER:INTERNAL=
libusb-1.0_LIBS_PATHS:INTERNAL=N:/3p-build/libusb/1.0.21/prebuilt/MS64/dll
libusb-1.0_PREFIX:INTERNAL=
libusb-1.0_STATIC_CFLAGS:INTERNAL=
libusb-1.0_STATIC_CFLAGS_I:INTERNAL=
libusb-1.0_STATIC_CFLAGS_OTHER:INTERNAL=
libusb-1.0_STATIC_LIBDIR:INTERNAL=N:/3p-build/libusb/1.0.21/prebuilt/MS64/static
libusb-1.0_STATIC_LIBS:INTERNAL=N:/3p-build/libusb/1.0.21/prebuilt/MS64/static/libusb-1.0.lib
libusb-1.0_STATIC_LIBS_L:INTERNAL=
libusb-1.0_STATIC_LIBS_OTHER:INTERNAL=
libusb-1.0_STATIC_LIBS_PATHS:INTERNAL=N:/3p-build/libusb/1.0.21/prebuilt/MS64/static
libusb-1.0_VERSION:INTERNAL=
libusb-1.0_libusb-1.0_INCLUDEDIR:INTERNAL=N:/3p-build/libusb/1.0.21/prebuilt/include/libusb-1.0
libusb-1.0_libusb-1.0_LIBDIR:INTERNAL=N:/3p-build/libusb/1.0.21/prebuilt/MS64/static
libusb-1.0_libusb-1.0_PREFIX:INTERNAL=
libusb-1.0_libusb-1.0_VERSION:INTERNAL=
我随后重新进入CMake并按Configure,结果所有我放在中的内容都被删除了,然后抱怨找不到库(当然)。
我从未在自己的项目中使用过CMake,所以其中的问题远超出了我的有限熟悉范围。
我该如何让CMake识别我拥有的libusb文件?
pkg-config
实用程序上工作,参见该答案。但是,您需要一个描述库的.pc
文件。 - Tsyvarev.pc
文件。有一个.pc.in
文件,但它似乎只能由 GNU 工具链处理,而我没有使用它。我打算手动将其编辑为.pc
文件,但并不确定所有变量的含义,所以会有一些试错过程。 - Kevin.pc
文件,pkg_check_modules()
将无法工作。最简单的方法是将对pkg_check_module()
的调用替换为直接设置libusb-1.0_LIBRARIES
变量的适当值。在这种情况下,不需要使用find_package(PkgConfig)
这一行。 - Tsyvarev