当前位置: 首页 > news >正文

CMake: 设置编译选项

CMake: 设置编译选项

  • 导言
  • 编译器选项相关概念
  • 编译器选项设置
  • 补充

导言

上一篇我们学习了构建类型的相关内容,并且可以生成了不同构建类型的库,这一篇我们将介绍编译器选项的相关内容。

编译器选项相关概念

编译器选项是指在编译程序时,可以通过设置不同的选项来控制编译器的行为和生成的代码的特性。常见的编译器选项包括优化选项调试选项警告选项链接选项等。

  • 优化选项可以控制编译器对代码进行优化的程度,以提高程序的性能。
  • 调试选项可以生成调试信息,以便在程序出现问题时进行调试。
  • 警告选项可以控制编译器是否生成警告信息,以帮助开发者发现潜在的问题。
  • 链接选项可以控制编译器如何将多个目标文件链接在一起,以生成最终的可执行文件。

不同的编译器可能支持不同的选项,具体的选项和使用方法可以参考编译器的文档或者官方网站。

本篇内容涉及到的编译器选项有:
优化选项-fPIC-fno-rtti-fno exception

  • -fPIC:表示生成位置无关代码。具体来说,位置无关代码可以在不同的进程空间中加载和执行,而不需要进行重定位操作。-fPIC选项通常用于生成动态库,因为动态库需要在不同的进程空间中加载和执行。使用-fPIC选项可以确保动态库中的代码可以在不同的进程空间中正确地执行。需要注意的是,使用-fPIC选项会增加代码的大小和运行时开销,因此需要根据具体情况来决定是否使用该选项。
  • -fno-rtti:选项可以控制编译器是否生成与C++运行时类型信息(RTTI)相关的代码,以减小程序的大小和运行时开销。需要注意的是,禁用RTTI可能会影响程序的可靠性和可维护性,因为RTTI可以帮助开发者在运行时获取对象的类型信息。因此,需要根据具体情况来决定是否使用该选项。
  • -fno exception:表示禁用C++异常处理机制。具体来说,使用该选项可以使编译器不生成与异常处理相关的代码,从而减小程序的大小和运行时开销。需要注意的是,禁用异常处理机制可能会影响程序的可靠性和可维护性,因为异常处理机制可以帮助开发者处理程序中的异常情况。因此,需要根据具体情况来决定是否使用该选项。

警告选项:-Wall-Wextra-Wpedantic

  • -Wall:表示开启所有警告信息。具体来说,编译器会生成所有可能的警告信息,包括一些可能会被忽略的警告信息。开启-Wall选项可以帮助开发者发现潜在的问题,提高代码的质量和可靠性。但是,由于-Wall会生成大量的警告信息,有时候会影响开发效率,因此需要根据具体情况来决定是否开启该选项。
  • -Wextra:表示开启额外的警告信息。具体来说,编译器会生成一些不属于-Wall选项的警告信息,例如一些不符合标准的代码风格、一些未使用的变量等。同理,开启-Wextra选项可以帮助开发者发现更多的潜在问题,提高代码的质量和可靠性。但是,由于-Wextra会生成更多的警告信息,有时候会影响开发效率,因此需要根据具体情况来决定是否开启该选项。
  • -Wpedantic:表示开启严格的警告信息。具体来说,编译器会生成一些不符合CC++标准的代码警告信息,例如使用了不推荐的语法、未定义的行为等。开启-Wpedantic选项可以帮助开发者编写符合标准的代码,提高代码的可移植性和可靠性。同理,由于-Wpedantic会生成更多的警告信息,有时候会影响开发效率,因此需要根据具体情况来决定是否开启该选项。

编译器选项设置

为目标准备了标志列表,其中一些将无法在Windows上使用:

list(APPEND compile_flags "-fPIC" "-Wall" "-fPIC")
if(NOT WIN32)list(APPEND compile_flags "-Wextra" "-Wpedantic")
endif()

为库设置编译选项:

target_compile_options(test_messagePRIVATE ${compile_flags}
)

编译选项可以添加三个级别的可见性:INTERFACEPUBLICPRIVATE

  • PRIVATE:编译选项会应用于给定的目标,不会传递给与目标相关的目标。
  • INTERFACE:给定的编译选项将只应用于指定目标,并传递给与目标相关的目标。
  • PUBLIC:编译选项将应用于指定目标和使用它的目标。

如何确定项目在CMake构建时,实际使用了哪些编译标志?

一种方法是,使用CMake将额外的参数传递给本地构建工具。本例中会设置环境变量VERBOSE=1

mkdir -p build
$ cd build
$ cmake ..
$ cmake --build . -- VERBOSE=1
... lots of output ...
Scanning dependencies of target test_message
make[2]: 离开目录“/home/jiangli/repo/tutorials/cmake-tutorial/chapter1/13/build”
/usr/bin/make -f message-module/CMakeFiles/test_message.dir/build.make message-module/CMakeFiles/test_message.dir/build
make[2]: 进入目录“/home/jiangli/repo/tutorials/cmake-tutorial/chapter1/13/build”
[ 25%] Building CXX object message-module/CMakeFiles/test_message.dir/src/message.cpp.o
cd /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/13/build/message-module && /usr/bin/c++   -I/home/jiangli/repo/tutorials/cmake-tutorial/chapter1/13/message-module/include  -O3 -DNDEBUG   -fPIC -Wall -Wextra -Wpedantic -std=gnu++11 -o CMakeFiles/test_message.dir/src/message.cpp.o -c /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/13/message-module/src/message.cpp
[ 50%] Linking CXX static library ../lib/libtest_message_release.a
... lots of output ...

第二种,使用CMake参数进行配置:

$ cmake -D CMAKE_CXX_FLAGS="-fno-exceptions -fno-rtti" ..

这个命令将编译项目,禁用异常和运行时类型标识(RTTI)。

补充

大多数时候,编译器有特性标示。当前的例子只适用于GCCClang;其他编译器不确定是否会理解这些标志。如果项目是真正跨平台,那么这个问题就必须得到解决,以下为两种解决方案:

第一种,所需编译器标志列表附加到每个配置类型CMake变量CMAKE_<LANG>_FLAGS_<CONFIG>。标志确定设置为给定编译器有效的标志,因此将包含在if-endif子句中,用于检查CMAKE_<LANG>_COMPILER_ID变量:

if(CMAKE_CXX_COMPILER_ID MATCHES GNU)list(APPEND CMAKE_CXX_FLAGS "-fno-rtti" "-fno-exceptions")list(APPEND CMAKE_CXX_FLAGS_DEBUG "-Wsuggest-final-types" "-Wsuggest-final-methods" "-Wsuggest-override")list(APPEND CMAKE_CXX_FLAGS_RELEASE "-O3" "-Wno-unused")
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES Clang)list(APPEND CMAKE_CXX_FLAGS "-fno-rtti" "-fno-exceptions" "-Qunused-arguments" "-fcolor-diagnostics")list(APPEND CMAKE_CXX_FLAGS_DEBUG "-Wdocumentation")list(APPEND CMAKE_CXX_FLAGS_RELEASE "-O3" "-Wno-unused")
endif()

第二种,定义特定的标志列表:

set(COMPILER_FLAGS)
set(COMPILER_FLAGS_DEBUG)
set(COMPILER_FLAGS_RELEASE)
if(CMAKE_CXX_COMPILER_ID MATCHES GNU)list(APPEND CXX_FLAGS "-fno-rtti" "-fno-exceptions")list(APPEND CXX_FLAGS_DEBUG "-Wsuggest-final-types" "-Wsuggest-final-methods" "-Wsuggest-override")list(APPEND CXX_FLAGS_RELEASE "-O3" "-Wno-unused")
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES Clang)list(APPEND CXX_FLAGS "-fno-rtti" "-fno-exceptions" "-Qunused-arguments" "-fcolor-diagnostics")list(APPEND CXX_FLAGS_DEBUG "-Wdocumentation")list(APPEND CXX_FLAGS_RELEASE "-O3" "-Wno-unused")
endif()

稍后,使用生成器表达式来设置编译器标志的基础上,为每个配置和每个目标生成构建系统:

target_compile_option(test_messagePRIVATE${CXX_FLAGS}"$<$<CONFIG:Debug>:${CXX_FLAGS_DEBUG}>""$<$<CONFIG:Release>:${CXX_FLAGS_RELEASE}>")

这里我们推荐使用第二种方法。

两种方法都有效,并在许多项目中得到广泛应用。不过,每种方式都有缺点。CMAKE_<LANG>_COMPILER_ID不能保证为所有编译器都定义。此外,一些标志可能会被弃用,或者在编译器的较晚版本中引入。

CMAKE_<LANG>_COMPILER_ID类似,CMAKE_<LANG>_COMPILER_VERSION变量不能保证为所有语言和供应商都提供定义。尽管检查这些变量的方式非常流行,但我们认为更健壮的替代方法是检查所需的标志集是否与给定的编译器一起工作,这样项目中实际上只使用有效的标志。

相关文章:

CMake: 设置编译选项

CMake: 设置编译选项 导言编译器选项相关概念编译器选项设置补充 导言 上一篇我们学习了构建类型的相关内容&#xff0c;并且可以生成了不同构建类型的库&#xff0c;这一篇我们将介绍编译器选项的相关内容。 编译器选项相关概念 编译器选项是指在编译程序时&#xff0c;可以…...

美团Java开发一面凉经

目录 1.HashMap底层数据结构2.列举几个常见的线程安全容器3.HashMap线程问题4.concurrentHashMap5.ConcurrentModificationException6.Spring AOP、IOC、DI介绍下7.不使用依赖注入&#xff0c;使用传统方式的声明会有什么问题8.最左前缀原则9.TCP三次握手、四次挥手 1.HashMap底…...

Java面试知识点(全)-spring面试知识点二

Java面试知识点(全) 导航&#xff1a; https://nanxiang.blog.csdn.net/article/details/130640392 注&#xff1a;随时更新 Spring 事物 事务简介&#xff1a; 事务管理是企业级应用程序开发中必不可少的技术&#xff0c;用来确保数据的完整性和一致性 事务就是一系列的动作&…...

【音视频开发】基础知识:视频封装格式和编码格式

文章目录 一、封装格式与编码格式的关系视频编码格式视频封装格式MP43GPRM、RMVBAVI、WMVVOBFLVMKVWebMMOVTS 封装格式与编码格式对应 一、封装格式与编码格式的关系 视频编码格式和视频封装格式的关系及区别 这两者的关系好比酒与酒瓶的关系&#xff0c;编码格式好比酒瓶里的…...

OData Web API 一个开放标准的协议

OData Web API 是一个开放标准的协议&#xff0c;用于创建和使用基于 RESTful 的 Web API。它允许开发人员通过统一的方式来发布、查询、操作和管理数据资源。 OData Web API 基于 OData 协议&#xff0c;该协议定义了一组规范和约定&#xff0c;用于建立与数据源交互的标准化…...

PT100温度采集

1、信号采集的基本原理 PT100是将温度信号转换为电阻输出&#xff0c;其电阻值变化范围为0~200Ω。AD转换器只能对电压进行转换&#xff0c;无法采集直接采集温度&#xff0c;因此&#xff0c;需要一个1mA恒电流源给PT100供电&#xff0c;将电阻变化转换为电压变化。使用恒流源…...

ThinkSystem DM 全闪存阵列 —— 通过全闪存 NVMe 转型加速您的业务

ThinkSystem DM 全闪存阵列——通过全闪存 NVMe 转型加速您的业务 挑战 要缩短产品上市时间并提高客户满意度&#xff0c;企业必须不断改善关键业务运营的速度和响应能力。其中的一个关键要素是全闪存存储&#xff0c;它可以大幅加速关键工作负载。 不过&#xff0c;随着全闪…...

SpringCloud------代码demo(二)

SpringCloud------代码demo&#xff08;二&#xff09; 编码实操 以订单——支付微服务模块作为基础&#xff0c;开始逐渐扩充 微服务架构编码构建 1.约定 > 配置 > 编码 2.IDEA新建project工作空间 3.Rest微服务工程构建 总父工程 POM project module 首先创建maven项…...

TCL语法

目录 脚本、命令和单词符 置换 变量置换 命令置换 反斜杠置换 双引号和花括号 注释 脚本、命令和单词符 一个 TCL 脚本可以包含一个或多个命令。命令之间必须用换行符或分号隔开。 set a 1 set b 2 或者 set a 1&#xff1b;set b 2 都是合法的 TC…...

Partial convolution Gated convolution

组会讨论帖 1. 图像修复 图像修复&#xff08;Image Inpainting&#xff09;&#xff0c;顾名思义&#xff0c;就是将图像中损坏的部分修复起来&#xff0c;是一种图像编辑技术&#xff0c;可以应用在移除物体、修复老照片、图像补全&#xff08;eg,地震插值&#xff09;等等。…...

量化投资 无套利 No-arbitrage

文章目录 量化投资 无套利 No-arbitrageState of Nature市场域 Market Span 套利 Arbitrage无套利和正线性定价规则 No-arbitrage and Positive Linear Pricing RuleImplication 1: One-price PrincipleImplication 2: PositivityImplication 3: AdditivityImplication 4: Homo…...

小程序容器助力智能移动门户统一

智能移动统一门户遵循“统一规划&#xff0c;统一标准&#xff0c;统一建设&#xff0c;统一运维”的指导思想。它灵活运用前端展示平台&#xff0c;微服务后端平台&#xff0c;流程引擎&#xff0c;规则引擎&#xff0c;非结构化数据平台&#xff0c;即时通讯平台&#xff0c;…...

opencv-python相机标定详解

文章目录 角点检测查看角点标定 opencv中内置了张正友的棋盘格标定法&#xff0c;通过一些姿态各异的棋盘格图像&#xff0c;就能标定相机的内外参数。 角点检测 第一步是角点检测&#xff0c;首先需要读取棋盘格图像 import numpy as np import cv2 import ospath imgs #…...

由斯坦福、Nautilus Chain等联合主办的 Hackathon 活动,现已接受报名

由 Stanford Blockchain Accelerator、Zebec Protocol、 Nautilus Chain、Rootz Lab 共同主办的黑客松活动&#xff0c;现已接受优秀项目提交参赛申请。 在加密行业发展早期&#xff0c;密码极客们就始终在对区块链世界基础设施&#xff0c;在发展方向的无限可能性进行探索。而…...

PBDB Data Service:Measurements of specimens(标本测量)

Measurements of specimens&#xff08;标本测量&#xff09; 描述参数以下参数可用于指定您感兴趣的标本种类以下参数可用于筛选所选内容以下参数还可用于根据分类筛选结果列表以下参数可用于生成数据存档您可以使用以下参数选择要检索的额外信息&#xff0c;以及要获取记录的…...

低调的接口工具 ApiKit

最近发现一款接口测试工具--ApiKit&#xff0c;我们很难将它描述为一款接口管理工具 或 接口自测试工具。 官方给了一个简单的说明&#xff0c;更能说明 Apikit 可以做什么。 ApiKit API 管理 Mock 自动化测试 异常监控 团队协作 ApiKit的特点&#xff1a; 接口文档定义&a…...

opengauss 的回归测试

目录 一、回归测试说明 二、单独执行测试用例&#xff08;开发调试&#xff09; 一、回归测试说明 opengauss/postgresql 的回归测试&#xff0c;通过执行SQL比较输出打印&#xff0c;判断代码修改是否改变了其它功能逻辑。 OG的回归测试大体上和PG类似&#xff0c;主要是通…...

计算机组成原理基础练习题第四章-计算机的运算方法

对真值0表示形式唯一的机器数是&#xff08;&#xff09;。A、原码    B、补码和移码C、反码    D、以上都不对在整数定点机中&#xff0c;下述说法正确的是&#xff08;&#xff09;。A、原码和反码不能表示-1,补码可以表示-1B、三种机器数均可表示-1C、三种机器数均可表示…...

SpringBoot定时任务里的多线程

SpringBoot定时任务里的多线程 提示前言遇到的问题验证与解决验证单线程执行单任务分析代码及结果 单线程执行多任务 解决实现单任务的多线程为每个任务创建一个子线程 解决多任务的多线程设定固定容量线程池动态设定容量线程池固定线程池和动态线程池的选择 简单总结借鉴及引用…...

YOLO V3 SPP ultralytics 第二节:根据yolo的数据集,生成准备文件和yolo的配置文件

目录 1. 介绍 2. 完整代码 3. 代码讲解 3.1 生成 my_train_data.txt和my_val_data.txt 3.2 生成 my_data.data 文件 3.3 生成 my_yolov3.cfg 3.4 关于my_data_label.names文件 1. 介绍 根据 第一节 的操作&#xff0c;已经生成了下图中圆圈中的部分&#xff0c;而本…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...