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

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

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


参考文章链接:选择编译器及设置编译器选项 


目录

一、选择编译器

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.lryc.cn/news/60385.html

相关文章:

  • MySQL having关键字详解、与where的区别
  • CSS中相对定位与绝对定位的区别及作用
  • 7.1 基本运放电路(1)
  • 交友项目【首页推荐,今日佳人,佳人信息】
  • kafka-5 kafka的高吞吐量和高可用性
  • Jmeter前置处理器和后置处理器
  • 手把手带你了解《线程池》
  • idea中使用git工具
  • 剖析DLL(动态链接库)的使用方法
  • 第二章 设计模式七大原则
  • 计网第五章.运输层—TCP报文的首部
  • 程序员最新赚钱指南!
  • 如何快速获取淘宝商品的详细信息?看这里就够了
  • id生成器
  • 为什么许多人吐槽C++11,那些语法值得我们学习呢?
  • 千耘农机导航的“星地一体”能力究竟是什么?
  • (数字图像处理MATLAB+Python)第四章图像正交变换-第四、五节:Radon变换和小波变换
  • 舌体胖瘦的自动分析-曲线拟合-或许是最简单判断舌形的方案(六)
  • 牛顿法、梯度下降法与拟牛顿法
  • 带你浅谈下Quartz的简单使用
  • C++ cout格式化输出
  • 查询练习:复制表的数据作为条件查询
  • Thymeleaf select回显并选中多个
  • 【Go 基础】变量
  • 国网B接口语音对讲和广播技术探究及与GB28181差别
  • 非计算机专业如何转行成为程序员?我用亲身经历教你用这三种方法
  • 2023年最新网络安全渗透工程师面试题汇总!不看亏大了!
  • 红黑树(C++实现)
  • leetcode尊享面试 100 题 - 1427. 字符串的左右移
  • 进来看看!跨境电商要这样选品才能做出爆款