没有使用ROS顶层CMakelists.txt,如何给所有子项目的cmake默认值?
Posted
技术标签:
【中文标题】没有使用ROS顶层CMakelists.txt,如何给所有子项目的cmake默认值?【英文标题】:ROS top level CMakelists.txt is not used, how to give cmake defaults for all sub projects? 【发布时间】:2021-05-25 23:12:39 【问题描述】:我在ROS REP 128 aka 中设置了一个工作区:
catkin_ws
src
CMakeLists.txt // < 1.
project_1
CMakeLists.txt
project_2
CMakeLists.txt
...
事实上,您可以仅使用 catkin 教程 here 来重现这一点。***CMakeLists.txt
(上例中的1.
)似乎没有来源。我可以告诉这一点,因为我在末尾添加了 weifnbwefn
行,期望出现 cmake 错误(在干净的构建中)但没有。
重现这个:
-
克隆上述存储库。
导航到
catkin_tutorials/create_package_pubsub/catkin_ws
用无法构建的东西修改src/CMakeLists.txt
。
使用catkin build
构建
所以这就引出了两个问题:
-
为什么不使用这个文件?
如何为我的所有子项目添加默认的 cmake 项?例如。如果我想为每个子项目添加
set(CMAKE_CXX_STANDARD 17)
?
对于 2. ,我知道我可以在 .catkin_tools
的构建配置文件中添加额外的 cmake 参数,但对于比几个参数更复杂的东西,这将无法扩展。
【问题讨论】:
无法重现此问题。您能否添加用于运行 cmake 的参数以进行初始配置(以及在您使用相对路径的情况下的工作目录)? 顺便说一句:假设“子项目”是指包含CMakeLists.txt
文件的目录,而不是通过add_subdirectory
添加的***文件:set(CMAKE_CXX_STANDARD 17)
应该可以解决问题,只要它在@之前完成987654335@;每个目录都有自己的变量范围,但如果变量不存在于当前目录的范围内,则读取访问权限会退回到“父目录”的范围(指的是add_subdirectory
建立的关系)。虽然目标属性具有更高的优先级,但子目录可以覆盖该值。
@f*** 我添加了一些复制步骤。
【参考方案1】:
My understanding from the docs 是src/CMakeLists.txt
旨在成为 ROS 安装中catkin/cmake/toplevel.cmake
的符号链接,不能被编辑。它仅在 CMake 驱动旧版构建工作流程时使用。
catkin build
实施的新工作流专门忽略此文件以隔离构建并防止一个包设置 CMake 缓存变量另一个读取的串扰。
所以回答了第 (1) 部分,但遗憾的是,我对 catkin 的经验不足,不知道存储常用配置的最佳做法是什么。我确实知道catkin build
有一个--cmake-args
标志,您可以将其与CMAKE_PROJECT_INCLUDE
变量一起使用,以注入包含您的设置的CMake 文件。
对于 C++17,具体如下:
$ catkin build --cmake-args -DCMAKE_CXX_STANDARD=17
在此处查看相关文档:https://catkin-tools.readthedocs.io/en/latest/verbs/catkin_build.html#temporarily-changing-build-flags
【讨论】:
以上是关于没有使用ROS顶层CMakelists.txt,如何给所有子项目的cmake默认值?的主要内容,如果未能解决你的问题,请参考以下文章
ROS学习之CMakelists.txt和package.xml
ROS学习之CMakelists.txt和package.xml