如何告诉CMake在哪里找到libusb?

5
我正在尝试构建 logger1,它通过 ElasticFusion从Kinect收集数据以进行离线SLAM。我正在Windows上构建。我尝试使用VS10为x64构建(我也有VS12,但某些依赖项预配置为VS10,所以为了保持简单,我使用它)。我使用的是CMake 3.9.0。
我已经解决了大部分依赖关系,但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文件?

https://cmake.org/cmake/help/v3.9/module/FindPkgConfig.html - arrowd
1
设置CMAKE_PREFIX_PATH变量即可在pkg-config实用程序上工作,参见该答案。但是,您需要一个描述库的.pc文件。 - Tsyvarev
@Tsyvarev 谢谢你的提示,看起来相关,但是不幸的是,在 Windows 预编译发行版或运行源代码分发中的 VS10 项目输出中都没有 .pc 文件。有一个 .pc.in 文件,但它似乎只能由 GNU 工具链处理,而我没有使用它。我打算手动将其编辑为 .pc 文件,但并不确定所有变量的含义,所以会有一些试错过程。 - Kevin
2
没有 .pc 文件,pkg_check_modules() 将无法工作。最简单的方法是将对 pkg_check_module() 的调用替换为直接设置 libusb-1.0_LIBRARIES 变量的适当值。在这种情况下,不需要使用 find_package(PkgConfig) 这一行。 - Tsyvarev
@Tsyvarev 谢谢,那个方法可行。如果你愿意,你可以把它作为答案,我会标记为已接受。 - Kevin
显示剩余2条评论
1个回答

2
你可以做以下事情 -
find_package(PkgConfig REQUIRED)
    pkg_check_modules(libusb REQUIRED libusb-1.0)

1
虽然这段代码可能提供了问题的解决方案,但最好添加上为什么/如何运作的上下文。这可以帮助未来的用户学习并最终将该知识应用到他们自己的代码中。当代码被解释时,您还可能会得到用户的积极反馈/赞同。 - Amit Verma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接