ROS2中CMake编译选项的设置

部署运行你感兴趣的模型镜像

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

指定使用的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_TYPECmake配置层面上的东西。最终编译类型的相关配置会转化到g++编译选项上。

参考:

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


觉得有用就点赞吧!

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

另外在公众号《首飞》内回复“机器人”获取精心推荐的C/C++,Python,Docker,Qt,ROS1/2等机器人行业常用技术资料。

您可能感兴趣的与本文相关的镜像

Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

### ROS中使用CMake编译和执行C++程序 在ROS环境中,通过`catkin_make`工具来调用CMake进行项目构建是一个常见做法[^3]。对于创建一个新的工作空间并初始化源码目录而言,命令如下: ```bash mkdir -p ~/test_ws/src && cd ~/test_ws/src catkin_init_workspace ``` 之后,在顶层目录下利用`catkin_make`完成整个包及其依赖项的编译过程: ```bash cd ~/test_ws catkin_make ``` 为了确保环境变量设置正确以便能够找到新编译好的可执行文件和其他资源,建议每次修改或重新编译后都执行一次下面这条指令: ```bash source devel/setup.bash ``` 当涉及到具体编写用于ROS系统的C++应用程序时,通常会在对应的package内放置源代码文件(比如命名为main.cpp),并且需要配置好该包下的`CMakeLists.txt`文件以指导CMake如何处理这些源文件以及它们之间的关系。 例如,如果打算生成动态链接库(.so),可以在`CMakeLists.txt`里指定相应的选项[^1]: ```cmake add_library(mylib SHARED src/main.cpp) set_target_properties(mylib PROPERTIES OUTPUT_NAME "mylib" PREFIX "") install(TARGETS mylib DESTINATION lib) ``` 而对于普通的可执行二进制文件,则可以这样写入到`CMakeLists.txt`当中: ```cmake add_executable(mynode src/main.cpp) target_link_libraries(mynode ${catkin_LIBRARIES}) ``` 最后一步就是启动核心服务并运行节点了。这可以通过先开启roscore再单独启动各个节点的方式实现;也可以直接在一个终端里面依次输入这两条命令来简化操作流程: ```bash roscore & rosrun package_name executable_name ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

首飞爱玩机器人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值