鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    ROS2中CMake编译选项的设置

    已定时 已固定 已锁定 已移动
    ROS 2相关问题
    ros2 cmake
    1
    1
    584
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 首飞Kevin首
      首飞Kevin
      最后由 编辑

      编译选项有很多,这里列出一些常用的编译选项设置,并说明作用。

      指定使用的C++版本

      set(CMAKE_CXX_STANDARD 17)
      

      可以根据需求设置11, 14, 17, 20等等C++版本。

      设置编译选项

      add_compile_options(-Wall -Wextra -Wpedantic -Wno-unused-parameter -g)
      

      告警选项:

      告警选项 作用描述
      -Wall 允许发出gcc提供的所有有用的报警信息
      -Wextra 对所有合法但值得怀疑的表达式发出警告
      -Werror 把告警信息当做错误信息对待
      -pedantic 允许发出ANSI C标准所列的全部警告信息
      -w 关闭所有警告(不推荐使用)
      -Wfatal-errors 遇到第一个错误就停止,减少查找错误时间

      我们加上了告警都转成错误后常常会看到下面的错误信息。

      error: unused parameter ‘test’ [-Werror=unused-parameter]
      
      error: variable 'begin' set but not used [-Werror=unused-but-set-variable]
      

      有地方设置了变量但没有使用,可以加上下面的代码消除这个类型的错误。

      #define UNUSED(x) (void)(x)
      

      代码生成选项:

      代码生成选项 选项作用描述
      -fPIC 编译动态库时,要求产生与位置无关代码(Position-Independent Code)。也就是代码中不使用绝对地址,而使用相对地址,因此加载器可以将它加载到内存任意位置并执行。如果不使用-fPIC,产生的代码中包含绝对地址。加载器加载它时,要先重定位,重定位会修改代码段的内容,因此每个进程都生成这个代码段的一份拷贝。
      -fvisibility=default or hidden 默认情况下,设置ELF镜像中符号的可见性为public或hidden。缺省值是default。hidden可以显著地提高链接和加载共享库的性能,生成更加优化的代码,提供近乎完美的API输出和防止符号碰撞。强烈建议在编译共享库的时候使用它。

      代码优化选项:

      优化选项 选项作用描述
      -O0 不优化。这是缺省值
      -O1 尝试优化编译时间和可执行文件大小。
      -O2 尝试几乎全部的优化功能,但不会进行“空间换时间”的优化方法。
      -O3 再打开一些优化选项:-finline-functions, -funswitch-loops 和 -fgcse-after-reload 。
      -O 等同与-O1
      -Os 对生成文件大小进行优化。打开 -O2 开的全部选项,除了会那些增加文件大小的。
      -fomit-frame-pointer 去掉所有函数SFP(Stack Frame Pointer),即在函数调用时不保存栈帧指针SFP。可以提高程序运行速度, 代价是不能通过backtrace进行调试。
      -fno-omit-frame-pointer 与-fno-omit-frame-pointer相反

      注意: -O1打开-fomit-frame-pointer选项

      注意: 无特别需求,优化选项也可不单独设置,直接设置后面提到的编译类型即可

      Debug选项:

      Debug选项 选项作用描述
      -g 产生带有调试信息的目标代码
      -ggdb 生成gdb专 用的调试信息,会有一些gdb专用的扩展
      -gdwarf-2 产生DWARF version2 的格式的调试信息

      注意: 无特别需求,Debug选项也可不单独设置,直接设置后面提到的编译类型即可

      设置编译类型

      在编译命令中指定,如下所示:

      colcon build --cmake-args '-DCMAKE_BUILD_TYPE=RelWithDebInfo'
      

      编译类型有如下四种:

      编译类型 类型描述 类似选项集
      Debug 关闭了代码优化,增加了代码调试信息,提升了警告等级 -O0 -g -Wall -D_DEBUG
      Release 程序达到最佳性能,运行速度最快,但丢失大量调试信息 -O2 -DNDEBUG
      RelWithDebInfo 该模式会尽量按照Release的模式编译,但仍带有调试信息,是一个在速度和调试信息间的折中选择。 -O0 -ggdb -DNDEBUG
      MinSizeRel 尽量减少执行文件的体积,一般用于嵌入式场景 -O1 -DNDEBUG -DMIN_SIZE_REL

      补充说明:

      DCMAKE_BUILD_TYPE中的配置与g++编译选项之间的关系:

      DCMAKE_BUILD_TYPE是Cmake配置层面上的东西。最终编译类型的相关配置会转化到g++编译选项上。

      参考:

      https://blog.51cto.com/u_15169172/2710502

      我是首飞,一位帮大家填坑的机器人开发攻城狮。

      1 条回复 最后回复 回复 引用 1
      • 第一个帖子
        最后一个帖子
      皖ICP备16016415号-7
      Powered by NodeBB | 鱼香ROS