ROS2中CMake编译选项的设置
原创原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
- 指定使用的C++版本
- 设置编译选项
暴走的单车 · 恶犬主动,行人小心哦🥰萌宠 ...· 5 月前 · |
任性的鸡蛋 · 徐锦江给迈克伴舞是真的吗 - 抖音· 1 年前 · |
坚韧的乌冬面 · 关注 | “带她回家,严惩恶人!” ...· 1 年前 · |
强悍的水煮肉 · 产业振兴是乡村振兴的重中之重· 1 年前 · |
编译选项有很多,这里列出一些常用的编译选项设置,并说明作用。
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
选项:
|
选项作用描述 |
---|---|
-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 |
该模式会尽量按照
|
-O0 -ggdb -DNDEBUG |
MinSizeRel |
尽量减少执行文件的体积,一般用于嵌入式场景 |
-O1 -DNDEBUG -DMIN_SIZE_REL |
补充说明:
DCMAKE_BUILD_TYPE
中的配置与
g++
编译选项之间的关系:
DCMAKE_BUILD_TYPE
是
Cmake
配置层面上的东西。最终编译类型的相关配置会转化到
g++
编译选项上。
参考:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
Copyright © 2013 - 2023 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2023 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有