【cmake篇】选择编译器及设置编译参数

news2024/11/27 20:22:13

实际开发的过程中,可能有多个版本的编译器,不同功能可能需要设置不同的编译参数。

参考博客链接:选择编译器及设置编译器选项 


目录

一、选择编译器

1、查看系统中已有的编译器

2、选择编译器的两种方式

二、设置编译参数

1、add_compile_options

2、通过设置CMAKE_CXX_FLAGS来配置

3、add_compile_options 与 CMAKE_CXX_FLAGS 配置的区别


一、选择编译器

1、查看系统中已有的编译器

既然是手动设置编译器,那么我们需要知道当前系统中有哪些编译器是允许我们使用的,gcc 和 g++ 编译器都放在了 /usr/bin 目录下。

查看gcc:

ls /usr/bin/gcc*

其中 gcc-5 表示的是 gcc 的 5.5 版本,gcc 则表示当前的默认版本 

 查看g++:

ls /usr/bin/g++*

g++ 也是同理,g++ 表示的是 当前默认版本 

2、选择编译器的两种方式

cmake 内置了编译器相关的变量来方便我们手动设置编译器,值得注意的是,C 编译器和 C++编译器的设置,使用的是不同的变量:

  • C 编译器:对应内置变量为 CMAKE_C_COMPILER
  • C++ 编译器:对应内置变量为 CMAKE_CXX_COMPILERps

方式一:命令行设置

使用 cmake 编译时,用的是cmake命令,我们可以在cmake命令的后面携带附加选项l,来指定要使用哪个版本的编译器。

# 设置 C 编译器(如果不指定版本的话,使用的是 gcc 的默认版本)
cmake .. -DCMAKE_C_COMPILER=/usr/bin/gcc
# 设置 C++ 编译器 (指定的编译器为 g++9 )
cmake .. -DCMAKE_C_COMPILER=/usr/bin/g++-9

ps:设置的编译器必须是要能在 /usr/bin 下找到的

方式二:CMakeLists.txt 设置

# 设置 C 编译器(如果不指定版本的话,使用的是 gcc 的默认版本)
set (CMAKE_C_COMPILER /usr/bin/gcc)
# 设置 C++ 编译器 (指定的编译器为 g++9 )
set (CMAKE_CXX_COMPILER /usr/bin/g++-9)

ps:这两条命令应该放在文件的开始位置(cmake_minimum_required命令之下,其他命令之上),否则可能无效

二、设置编译参数

配置编译参数有两种方式,一种是使用 add_compile_options 命令配置;另一种是通过设置变量 CMAKE_C_FLAGS 或者 CMAKE_CXX_FLAGS 来配置。

1、add_compile_options

可以添加多个参数,不同参数之间通过空格隔开,命令格式如下:

add_compile_options(<option> ...)

示例:

if (MSVC)
    add_compile_options(/W4 /WX)
else(MSVC)
    add_compile_options(-Wall -Wextra -pedantic -Werror)
endif(MSVC)

2、通过设置CMAKE_CXX_FLAGS来配置

CMAKE_C_FLAGS 是 C 编译器的编译选项,CMAKE_CXX_FLAGS 是 C++编译器的编译选项,两者都仅对当前编译器有效。

# 设置 C 编译器的编译选项
set(CMAKE_C_FLAGS -Wall -O3)

# 设置 C++ 编译器的编译选项
set(CMAKE_CXX_FLAGS
    -std=c++11
    -Wall
    -O3
)

3、add_compile_options 与 CMAKE_CXX_FLAGS 配置的区别

add_compile_optionsCMAKE_CXX_FLAGS
编译器角度对所有编译器都有效仅针对 C++ 编译器
作用范围的角度作用域是全局,对子工程中的编译也有效仅针对当前文件(当前子工程)的编译

对于一些在整个项目中通用的编译选项可以使用add_compile_options命令来添加比较方便,对于各个模块中的独立选项则使用CMAKE_CXX_FLAGS变量更好 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/423508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSSOM和CSSOM View

CSSOM和CSSOM View这两个我都不是熟悉的领域。 1.描述样式表和规则等 CSS 的模型部分&#xff08;CSSOM&#xff09; cssom中document.styleSheets &#xff1a;获取文档中所有的样式&#xff08;只读&#xff09;&#xff0c;这个不常见&#xff0c;不做过多的介绍 2.元素视图…

科普|汽车毫米波雷达的规定和标准 微功率短距离无线电发射SRRC认证

01 — 24-24.25 GHz 上一篇提到&#xff0c;在我国《微功率短距离无线电发射设备目录和技术要求》中&#xff0c;保留了24-24.25 GHz的频段作为H类设备&#xff0c;可以用于汽车雷达&#xff0c;它的发射功率限值是&#xff1a;20mW (e.i.r.p)&#xff0c;近似为13dBm。除了…

【Open CASCADE -生成MFC和QT事例方式】

源代码目录 adm目录&#xff1a;包含编译OCCT的相关工程; adm/cmake目录&#xff1a;包含使用CMake构建OCCT的相关处理脚本; adm/msvc目录&#xff1a;包含window平台 Visual C 2010, 2012, 2013, 2015, 2017 and 2019等版本的32/64平台solutinon文件; data目录&#xff1a; 包…

ESP32驱动1.28寸GC9A01播放视频(二、程序说明和效果展示)

ESP32驱动1.28寸GC9A01播放视频&#xff08;二、程序下载和效果展示&#xff09;1.28寸GC9A01屏幕屏幕引脚定义程序说明程序更改1、Arduino_DataBus *bus和Arduino_GC9A01 *gfx要改成ESP32匹配的2、SPI库的SPI.cpp文件中的“SPIClass::begin”函数中&#xff0c;引脚定义需要跟…

分布式跟踪系统

分布式跟踪系统 背景 当代的互联网的服务&#xff0c;通常都是用复杂的、大规模分布式集群来实现的。互联网应用构建在不同的软件模块集上&#xff0c;这些软件模块&#xff0c;有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器&#xff0…

护眼灯真的可以保护眼睛吗?推荐五款达到护眼级别的灯

护眼灯是可以起到一定的保护视力的作用。 普通的台灯的出现是为了照明&#xff0c;它的功能只要照明。像眩光、频闪、蓝光等是普通台灯所存在的问题&#xff0c;而这些问题会造成我们的眼睛近视&#xff0c;所以在我国近年来青少年近视率越来越高的重要原因之一。 护眼灯就优化…

对比斐波那契和快排时间复杂度

斐波那契数列时间复杂度 ​ // 计算斐波那契递归Fib的时间复杂度&#xff1f; long long Fib(size_t N) {if(N < 3)return 1;return Fib(N-1) Fib(N-2); }Fib()递归高度是N&#xff0c;那它最后一层就是2^(N-1) 如果N50&#xff0c;最后一层是2^(49)一个恐怖的值 更恐怖…

手撕Udp套接字|实现群聊通信|实现Windows Linux通信交互

​ 专栏和Git地址 操作系统https://blog.csdn.net/yu_cblog/category_12165502.html?spm1001.2014.3001.5482UdpSockethttps://github.com/Yufccode/BitCode/tree/main/Linux/%E4%BB%A3%E7%A0%81/0215Udp%E5%A5%97%E6%8E%A5%E5%AD%97 README 本项目通过Linux套接字编程&…

AiDD AI+软件研发数字峰会开启编程新纪元

随着OpenAI 推出全新的对话式通用人工智能工具——ChatGPT火爆出圈后&#xff0c;人工智能再次受到了工业界、学术界的广泛关注&#xff0c;并被认为向通用人工智能迈出了坚实的一步&#xff0c;在众多行业、领域有着广泛的应用潜力&#xff0c;甚至会颠覆很多领域和行业&#…

go+vue——基于gin框架和gorm的web开发实战

govue——基于gin框架和gorm的web开发实战gin框架视频、资料、笔记安装Go环境&#xff0c; 添加环境变量&#xff08;可能自动添加好&#xff09;下载 Go环境变量goland 报错&#xff1a; GOROOT is not defined创建项目&#xff1a;Golang中的GoPath和GoModule什么是GoPath&am…

kafka安装

kafka安装前置将压缩包拷贝到虚拟机中解压改名更改server.properties启动先启动zookeeper非静默启动。会占用一个黑窗口再启动一个窗口&#xff0c;用jps查看静默启动 加一个-daemon另一种静默启动操作命令创建消息队列查看消息队列创建副本&#xff08;备份&#xff09;单机版…

MySQL数据库,数据的约束

目录 1.数据的约束 1.1约束的类型 1.2NULL约束 1.3UNIQUE约束 1.4DEFAULT约束 1.5PRIMARY KEY约束 1.6FOREIGN KEY约束 1.数据的约束 首先&#xff0c;创建一个名为test的数据库&#xff1a; mysql> create database test charset utf8; Query OK, 1 row affected …

Vue3中shallowRef和shallowReactive的使用?

shallowRef 和 shallowReactive前言shallowRef 和 shallowReactive概述区别shallowReactiveshallowRef总结&#xff1a;注意为什么使用shallowRef和shallowReactive&#xff1f;我们在之前的博客进过 ref 函数和 reactive 函数&#xff0c;他们的作用是将数据转换成响应式的数据…

真空压力控制方法在X射线探测器窗口薄膜材料力学性能测试中的应用

摘要&#xff1a;针对X射线窗口膜材料机械性能测试中对真空度和高压压力的准确控制需要&#xff0c;本文提出了相应的解决方案。解决方案中采用了薄膜电容真空计、压力传感器、电动针阀、压力调节阀和真空压力PID控制器&#xff0c;与真空泵和高压气源配合&#xff0c;可在膜材…

5Element

一、Element-快速入门 1、安装ElementUi组件库 输入npm install element-ui2.15.3 2、引入ElementUi组件库 https://element.eleme.cn/#/zh-CN/component/quickstart //引入element-ui import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css;Vue.…

Java魔法类 Unsafe应用解析

前言 Unsafe是位于sun.misc包下的一个类&#xff0c;主要提供一些用于执行低级别、不安全操作的方法&#xff0c;如直接访问系统内存资源、自主管理内存资源等&#xff0c;这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Ja…

【Linux】man什么都搜不了,No manual entry for xxx的解决方案

本文首发于 慕雪的寒舍 man什么都搜不了&#xff0c;No manual entry for xxx的解决方案 系统 CentOS 7.6 1.问题描述 今天查手册的时候&#xff0c;发现man什么都查不了。不管是系统接口还是函数&#xff0c;都显示没有入口文档&#xff08;No manual entry for&#xff09;…

狂追ChatGPT:开源社区的“平替”热潮

目前&#xff0c;不少优质的类ChatGPT模型都只能通过API接入&#xff0c;而一些开源LLM的效果与ChatGPT相比差距不小。不过&#xff0c;近期开源社区开始密集发力了。 其中&#xff0c;Meta的LLaMA模型泄漏是开源“ChatGPT”运动的代表性事件。基于LLaMA模型&#xff0c;开源社…

条款08: 别让异常逃离析构函数

文章目录背景知识析构函数背景知识 下面是一段测试代码&#xff1a; class Test { public:Test(int para){m_num para;};void test_throw(){throw(3);};~Test() {cout<<"delete Test"<<m_num<<endl;//test_throw();};int m_num; }; int main() …

牛客乔迁新居,新址在……

有个好消息想向大家公布&#xff1a;牛客&#xff08;上海办公室&#xff09;搬家啦&#xff01; 自3月27日起&#xff0c;牛客&#xff08;上海办公室&#xff09;正式乔迁至上海市长宁区长宁路999号兆丰广场办公楼G层G15。新的办公室坐落在上海长宁区的中心地带&#xff0c;…