【问题标题】:Handling multiple FIND_PACKAGE calls in CMake在 CMake 中处理多个 FIND_PACKAGE 调用
【发布时间】:2013-11-12 07:01:07
【问题描述】:

我有一个关于 CMake 中的 FIND_PACKAGE 函数的快速问题。我有一个利用点云库(PCL)的项目。 PCL 依赖于 Boost,我的项目也是如此。所以,在我的 CMakeLists.txt 的顶部,我有以下内容:

FIND_PACKAGE(Boost REQUIRED COMPONENTS program_options)

# Preserve project Boost required libraries
SET(Boost_PROJECT_LIBRARIES ${Boost_LIBRARIES})

FIND_PACKAGE(PCL 1.6 REQUIRED COMPONENTS common search)

我的项目使用了 Boost.program_options 库,而 PCL 需要其他几个。当FIND_PACKAGE(PCL ...) 运行时,它会用自己需要的库覆盖以前的${Boost_LIBRARIES}。我想出了一个解决方法来保存我的项目所需的 Boost 库,然后找到 PCL 包。

我对 CMake 大师的问题是有没有更好的方法来处理 CMake 中的这类事情?或者,这可能是 FindBoost.cmake 或 FindPCL.cmake 模块中的错误吗?

【问题讨论】:

  • 根据我的经验,不幸的是,这是您的最佳选择。除非您想修复 FindPCL.cmake 模块。再说一次,只是我的经验。
  • 如果没有find_package-option 在两个find_package 命令之间发生变化(比如设置BOOST_ROOT 或其他东西),那么我认为你是对的 - 这是一个错误
  • 为什么不复制 FindPCL.cmake,“修复”它并使用 CMAKE_MODULE_PATH 让 cmake 找到您的版本?

标签: c++ boost cmake point-cloud-library


【解决方案1】:

Boost 的 find 包使用您选择的组件的库填充一个局部变量 (Boost_LIBRARIES)。打电话是绝对安全的

find_package(Boost REQUIRED COMPONENTS program_options)

(或其他任何东西)就在您想要使用它之前。这将确保为您的可执行文件正确填充变量。

一些查找模块采用使用自定义结果填充局部变量以在该目录/可执行文件中使用的方法,同时将大部分繁重的工作推迟到全局缓存变量。 Qt 和 6.0 中的新 VTK 配置代码执行相同的操作,因此您可以想象有几个不同版本的 Boost_LIBRARIES,这取决于当前范围内最近的 find_package 调用。

【讨论】:

    猜你喜欢
    • 2018-02-05
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2019-12-20
    • 2016-02-02
    • 1970-01-01
    相关资源
    最近更新 更多