没有使用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中添加自己的库路径

ROS学习之CMakelists.txt和package.xml

ROS学习之CMakelists.txt和package.xml

ROS学习之CMakelists.txt和package.xml

创建ROS的Package(功能包)

将 Makefile 转换为 CMakeLists.txt