目录

一、为每个目标设置编译标志

1.获取编译器标志

2.设置编译选项

(1)target_compile_options

(2) check_cxx_compiler_flag

二、统一设置所有目标的编译标志

三、总结


CMake为调整或扩展编译器标志提供了很大的灵活性,控制项目的编译器标志有两种方法:

  • CMake将编译选项视为目标属性。因此,可以根据每个目标设置编译选项,而不需要覆盖CMake 默认值。
  • 可以使用 -D CLI标志直接修改CMAKE_<LANG>_FLAGS_<CONFIG>变量。这将影响项目中的所有目标,并覆盖或扩展CMake默认值。

一、为每个目标设置编译标志

以这种方式添加编译选项,不会影响全局CMake变量CMAKE_<LANG>_FLAGS_<CONFIG>,并能更细粒度控制在哪些目标上使用哪些选项。

1.获取编译器标志

message("C++ compiler flags:${CMAKE_CXX_FLAGS}")

输出:C++ compiler flags:/DWIN32 /D_WINDOWS /W3 /GR /EHsc

2.设置编译选项

(1)target_compile_options

target_compile_options(<target> [BEFORE]<INTERFACE|PUBLIC|PRIVATE> [items1...][<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

编译选项可以添加三个级别的可见性: INTERFACE 、 PUBLIC 和 PRIVATE 。可见性的含义如下:

  • PRIVATE,编译选项会应用于给定的目标,不会传递给与目标相关的目标。比如,即使exe将链接到A库,exe也不会继承A目标上设置的编译器选项。
  • INTERFACE,给定的编译选项将只应用于指定目标,并传递给与目标相关的目标。
  • PUBLIC,编译选项将应用于指定目标和使用它的目标。

可以为库、可执行文件设置编译选项。

target_compile_options(lib PRIVATE -O3)
#-O3:编译器优化级别编译库 。

(2) check_cxx_compiler_flag

check_cxx_compiler_flag(<flag> <var>)

检查C++编译器是否支持某个/某些flag标志,检测结果存放在var变量中。

check_<LANG>_compiler_flag 函数只是 check_<LANG>_source_compiles 函数的包装器。check_cxx_compiler_flag命令临时设置CMAKE_REQUIRED_DEFINITIONS变量,并从CheckCXXSourceCompiles模块调用check_cxx_source_compiles宏。

#声明列表 CXX_BASIC_FLAGS ,其中包含构建项目时始终使用的编译器标志 -g3 和 -O1
list(APPEND CXX_BASIC_FLAGS "-g3" "-O1")
#包括CMake模块 CheckCXXCompilerFlag.cmake
include(CheckCXXCompilerFlag)
#声明一个 ASAN_FLAGS 变量,它包含Sanitizer所需的标志
set(ASAN_FLAGS "-fsanitize=address -fno-omit-frame-pointer")
#设置 CMAKE_REQUIRED_FLAGS 变量, check_cxx_compiler_flag 函数在内部使用该变量
set(CMAKE_REQUIRED_FLAGS ${ASAN_FLAGS})
#调用 check_cxx_compiler_flag 来确保编译器理解 ASAN_FLAGS 变量中的标志
check_cxx_compiler_flag(${ASAN_FLAGS} asan_works)
#取消设置 CMAKE_REQUIRED_FLAGS
unset(CMAKE_REQUIRED_FLAGS)
if(asan_works)#将变量转换为一个列表,用分号替换空格string(REPLACE " " ";" _asan_flags ${ASAN_FLAGS})add_executable(asan-example asan-example.cpp)#为可执行文件设置编译器标志,以包含基本的和Sanitizer标志target_compile_options(asan-examplePUBLIC${CXX_BASIC_FLAGS}${_asan_flags})#将Sanitizer标志添加到链接器使用的标志集中target_link_libraries(asan-examplePUBLIC${_asan_flags})
endif()

二、统一设置所有目标的编译标志

使用 -D CLI标志直接修改CMAKE_<LANG>_FLAGS_<CONFIG>变量。下面代码为网上找的例子:

SET(CMAKE_CXX_FLAGS_RELEASE "-g -DNDEBUG -O3")
  1. -O2 or -O3:优化级别

  2. -fPIC:产生与位置无关代码(Windows不支持)

  3. -g:调试信息

  4. -Wall:开启所有的编译警告

三、总结

编译器就是把源代码翻译成目标代码的工具,目标代码可以是机器码,也可以是其他代码。

预处理器就是在代码交给编译器处理前,预先进行一些处理,比如包含头文件,宏展开等等。

CMake I 设置编译器标志相关推荐

  1. CMake I 获取/设置编译器

    目录 一.获取编译器信息 1.与编译器交互 (1)CMake变量 (2)CMakeLists.txt 二.设置编译器 一.获取编译器信息 Microsoft Windows上,如果cmake生成器是V ...

  2. android中c文件怎么加logo,c – 如何在CMake中添加“-l”(ell)编译器标志

    在Ubuntu 16上工作 我使用g main.cpp -lpq命令编译我的小项目.现在我使用Clion,并想做同样的事情.但我不能在cmake文件中添加编译器标志并得到编译错误. cmake_min ...

  3. C2429 语言功能“结构化绑定“需要编译器标志“/std:c++17“

    C2429 语言功能"结构化绑定"需要编译器标志"/std:c++17" 1.问题 vs2019打开工程时报错:C2429 语言功能"结构化绑定&qu ...

  4. CMake入门1——CMake与VS编译器和nmake的结合使用

    下载 安装 例1 使用cmake-gui与VS生成器 例3 PreLoadcmake用法 本文描述在Win10-64位系统中安装CMake.cmake-gui的简单使用及其与VS2015编译器的结合使 ...

  5. CMAKE 调用交叉编译器(CMAKE使用)

    CMAKE命令使用时需要与CMakeLists.txt在不同的目录下,一般是在CMakeList.txt文档所在的目录下创建一个build文件夹,然后cd到build文件夹,执行cmake ..,此时 ...

  6. 编译是检查c语言,为什么CMake检查C编译器?

    我想构建一个构建C程序的最小示例.我使用了这个CMakeLists.txt文件: cmake_minimum_required(VERSION 3.6) set(CMAKE_SYSTEM_NAME G ...

  7. 【CMAKE】指定编译器架构(x86 or x64)

    1.Windows vs2015 x64编译器为例,cmake命令如下: cmake -G "Visual Studio 14 Win64" path\to\source\dir ...

  8. Uefi ABL读取XBL设置的标志位

    高通启用UEFI架构的bootloader,有些时候有些状态值,需要ABL阶段获取. 上层思维总是以属性来开端,实际上android 的setproperty和getproperty属性对于uefi启 ...

  9. Qt CMake Windows设置图标

    创建rc文件 eg : app_win32.rc 内容 IDI_ICON1 ICON DISCARDABLE "icons/icon.ico" 在项目根目录下创建icons文件夹 ...

最新文章

  1. 关于反爬虫,看这一篇就够了
  2. Oracle中的序列 sequence 用法
  3. C语言荣获2019年度最佳编程语言
  4. 北京XXX学院WLAN项目现场勘查报告
  5. Oracle存储过程 使用游标、数组的配合查询
  6. Linux下Gcc 的编译过程
  7. 如何在你的项目中集成 CAP【手把手视频教程】
  8. PAT L1-048 矩阵A乘以B
  9. Qt文档阅读笔记-继承QProgressDialog使得Dialog更加灵活
  10. 条令考试小程序辅助器_应知应会|条令纲要学习微课堂(六)
  11. php基础知识和函数
  12. python之将python代码编译成.so
  13. HIS(Hospital Information System,医院信息系统)简介
  14. java字符串的长度_java中如何统计一个字符串的长度
  15. Linux系统如何隐藏一个文件?
  16. sci四区大水刊 计算机,sci四区大水刊_sci四区免费大水刊_sci四区什么水平
  17. 在vs2008中运行这个就闪退了,,还出不来结果
  18. dilated(dilated cardiomyopathy)
  19. Ubuntu设为桥接模式自动获取ip但无法上网
  20. 计算机与英语教学相结合,计算机与英语教学结合_英语论文.doc

热门文章

  1. 告诉你四川火锅的秘密配方
  2. 我的世界java版是免费,我的世界Java版
  3. $STRM 空投和 Strategy Stakers 代币分配
  4. Maven插件wagon-maven-plugin自动化部署Java项目到Linux远程服务器
  5. 获取壁纸网站第一页至第n页的壁纸
  6. 三极管(如NPN)集电极正偏 发射极反偏会怎么样呢? 电流会倒流吗? 其他三种都知道,就是不知道这种情况
  7. 按键精灵大漠插件使用基础练习入门代码
  8. 称金币问题: 有27枚金币,其中一个是假的。假的比真的略轻。现在有一个天平,问最少几次可以找出假币?
  9. 【无标题】惠普ZHAN 66 PRO 14 G3 NOTEBOOK PC笔记本电脑装好系统没有触摸板驱动
  10. Flutter 数字增加动画