我对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模块中的错误吗?
答案 0 :(得分:2)
Boost的find包使用您选择的组件的库填充局部变量(Boost_LIBRARIES)。致电
非常安全find_package(Boost REQUIRED COMPONENTS program_options)
(或其他任何东西)就在您想要使用它之前。这将确保为您的可执行文件正确填充变量。
有几个查找模块采用填充本地变量的方法,使用自定义结果在该目录/可执行文件中使用,同时将大部分繁重工作推迟到全局缓存变量。 Qt和6.0中的新VTK配置代码也是如此,所以你可以想象有几个不同版本的Boost_LIBRARIES,它们取决于当前作用域中最近的find_package调用。