当前位置:网站首页>ROS2中CMake编译选项的设置
ROS2中CMake编译选项的设置
2022-07-04 03:51:00 【首飞爱玩机器人】
编译选项有很多,这里列出一些常用的编译选项设置,并说明作用。
指定使用的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
觉得有用就点赞吧!
我是首飞,一个帮大家填坑的机器人开发攻城狮。
另外在公众号《首飞》内回复“机器人”获取精心推荐的C/C++,Python,Docker,Qt,ROS1/2等机器人行业常用技术资料。
边栏推荐
- Is it safe to buy insurance for your children online? Do you want to buy a million dollar medical insurance for your children?
- EV6 helps the product matrix, and Kia is making efforts in the high-end market. The global sales target in 2022 is 3.15 million?
- 线程常用的方法
- Reduce function under functools
- Katalon使用script实现查询List大小
- Redis cluster uses Lua script. Lua script can also be used for different slots
- User defined path and file name of Baidu editor in laravel admin
- I Build a simple microservice project
- Brief explanation of depth first search (with basic questions)
- Evolution of MySQL database architecture
猜你喜欢
mysql数据库的存储
ctf-pikachu-XSS
Wechat official account web page authorization
MySQL maxscale realizes read-write separation
指针数组和数组指针
leetcode刷题:二叉树06(对称二叉树)
Evolution of MySQL database architecture
PostgreSQL users cannot create table configurations by themselves
Idea configuration 360zip open by default -- external tools
The maximum expiration time of client secret in azure ad application registration is modified to 2 years
随机推荐
SQL statement strengthening exercise (MySQL 8.0 as an example)
Programmers' telecommuting is mixed | community essay solicitation
华为云鲲鹏工程师培训(广西大学)
The three-year revenue is 3.531 billion, and this Jiangxi old watch is going to IPO
JDBC advanced
ctf-pikachu-CSRF
疫情来袭--远程办公之思考|社区征文
Exercices de renforcement des déclarations SQL (MySQL 8.0 par exemple)
Understand the principle of bytecode enhancement technology through the jvm-sandbox source code
ctf-pikachu-CSRF
三年进账35.31亿,这个江西老表要IPO了
【微服务|openfeign】feign的两种降级方式|Fallback|FallbackFactory
Brief explanation of depth first search (with basic questions)
MySQL maxscale realizes read-write separation
[webrtc] M98 Ninja build and compile instructions
A review of reverse reinforcement learning at Virginia Tech (VT)
Msgraphmailbag - search only driveitems of file types
Lnk2038 detected a mismatch of "runtimelibrary": the value "md_dynamicrelease" does not match the value "mdd_dynamicdebug" (in main.obj)
函数计算异步任务能力介绍 - 任务触发去重
hbuildx中夜神模拟器的配置以及热更新