引言#

CMake支持以多种不同方式设置编译标志:

  • 使用target_compile_definitions()函数
  • 使用CMAKE_C_FLAGS和CMAKE_CXX_FLAGS变量。

本教程中的文件如下:

$ tree
.
├── CMakeLists.txt
├── main.cpp
  • [CMakeLists.txt] - 包含要运行的CMake命令

    cmake_minimum_required(VERSION 3.5)# Set a default C++ compile flag
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEX2" CACHE STRING "Set C++ Compiler Flags" FORCE)# Set the project name
    project (compile_flags)# Add an executable
    add_executable(cmake_examples_compile_flags main.cpp)target_compile_definitions(cmake_examples_compile_flags PRIVATE EX3
    )
    
  • [main.cpp] - 具有main的源文件

    #include <iostream>int main(int argc, char *argv[])
    {std::cout << "Hello Compile Flags!" << std::endl;// only print if compile flag set
    #ifdef EX2std::cout << "Hello Compile Flag EX2!" << std::endl;
    #endif#ifdef EX3std::cout << "Hello Compile Flag EX3!" << std::endl;
    #endifreturn 0;
    }
    

概念#

设置每个目标的C++标志#

在现代CMake中设置C++标志的推荐方式是使用每个目标的标志,这些标志可以通过target_compile_definitions()函数的作用域(或者说接口范围)递到其他目标(INTERFACE或PUBLIC)。这将填充库的INTERFACE_COMPILE_DEFINITIONS,并根据作用域将定义传递到链接的目标。

target_compile_definitions(cmake_examples_compile_flagsPRIVATE EX3
)

这将导致编译器在编译目标时添加定义 -DEX3。

如果目标是库,并且已经选择了作用域PUBLIC或者INTERFACE,则该定义也将包含在链接该目标的任何可执行文件中。

对于编译器选项,你还可以使用target_compile_options()函数。

设置默认C++标志#

CMAKE_CXX_FLAGS的默认值为空或包含生成类型的相应标志。

要设置其他默认编译标志,可以将以下内容添加到顶级CMakeLists.txt。

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEX2" CACHE STRING "Set C++ Compiler Flags" FORCE)

与CMAKE_CXX_FLAGS类似的其他选项包括:

  • 使用CMAKE_C_FLAGS设置 C 编译器标志
  • 使用CMAKE_LINKER_FLAGS设置链接器标志

一旦设置,CMAKE_C_FLAGS和CMAKE_CXX_FLAGS将为该目录或任何包含的子目录中的所有目标全局设置编译器标志/定义。现在不建议将此方法用于一般用途,最好使用target_compile_definitions函数。

设置CMake标志#

与构建类型类似,可以使用以下方法设置全局C++编译器标志。

  • 使用GUI工具,如ccmake/cmake-gui

  • 传递到cmake

cmake .. -DCMAKE_CXX_FLAGS="-DEX3"

构建示例#

$ mkdir build$ cd build/$ cmake ..
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build$ make VERBOSE=1
/usr/bin/cmake -H/home/matrim/workspace/cmake-examples/01-basic/G-compile-flags -B/home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build/CMakeFiles /home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory `/home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build'
make -f CMakeFiles/cmake_examples_compile_flags.dir/build.make CMakeFiles/cmake_examples_compile_flags.dir/depend
make[2]: Entering directory `/home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build'
cd /home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/matrim/workspace/cmake-examples/01-basic/G-compile-flags /home/matrim/workspace/cmake-examples/01-basic/G-compile-flags /home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build /home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build /home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build/CMakeFiles/cmake_examples_compile_flags.dir/DependInfo.cmake --color=
Dependee "/home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build/CMakeFiles/cmake_examples_compile_flags.dir/DependInfo.cmake" is newer than depender "/home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build/CMakeFiles/cmake_examples_compile_flags.dir/depend.internal".
Dependee "/home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build/CMakeFiles/CMakeDirectoryInformation.cmake" is newer than depender "/home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build/CMakeFiles/cmake_examples_compile_flags.dir/depend.internal".
Scanning dependencies of target cmake_examples_compile_flags
make[2]: Leaving directory `/home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build'
make -f CMakeFiles/cmake_examples_compile_flags.dir/build.make CMakeFiles/cmake_examples_compile_flags.dir/build
make[2]: Entering directory `/home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build'
/usr/bin/cmake -E cmake_progress_report /home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build/CMakeFiles 1
[100%] Building CXX object CMakeFiles/cmake_examples_compile_flags.dir/main.cpp.o
/usr/bin/c++    -DEX2   -o CMakeFiles/cmake_examples_compile_flags.dir/main.cpp.o -c /home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/main.cpp
Linking CXX executable cmake_examples_compile_flags
/usr/bin/cmake -E cmake_link_script CMakeFiles/cmake_examples_compile_flags.dir/link.txt --verbose=1
/usr/bin/c++    -DEX2    CMakeFiles/cmake_examples_compile_flags.dir/main.cpp.o  -o cmake_examples_compile_flags -rdynamic
make[2]: Leaving directory `/home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build'
/usr/bin/cmake -E cmake_progress_report /home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build/CMakeFiles  1
[100%] Built target cmake_examples_compile_flags
make[1]: Leaving directory `/home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build'
/usr/bin/cmake -E cmake_progress_start /home/matrim/workspace/cmake-examples/01-basic/G-compile-flags/build/CMakeFiles 0

CMake基础 第7节 编译标志相关推荐

  1. CMake基础 第2节 分离编译

    介绍# 展示一个hello world示例,它使用不同的文件夹来存储源文件和头文件. 本教程中的文件包括: B-hello-headers$ tree . ├── CMakeLists.txt ├── ...

  2. CMake基础 第1节 初识CMake

    介绍# 本节展示一个非常基本的hello world的例子. 本节中的文件如下: A-hello-cmake$ tree . ├── CMakeLists.txt ├── main.cpp [CMak ...

  3. CMake基础 第5节 安装项目

    介绍# 此示例说明如何生成make install目标以在系统上安装文件和二进制文件.这基于前面的共享库示例. 本教程中的文件如下: $ tree . ├── cmake-examples.conf ...

  4. CMake基础 第4节 动态库

    介绍# 继续展示一个hello world示例,它将首先创建并链接一个共享库. 这里还显示了如何创建别名目标 本教程中的文件如下: $ tree . ├── CMakeLists.txt ├── in ...

  5. CMake基础 第3节 静态库

    介绍# 继续展示一个hello world示例,它首先创建并链接一个静态库.这是一个简化示例,这里的库和二进制文件在同一个文件夹中.通常,这些将会被放到子项目中,这些内容将会在以后描述. 本教程中的文 ...

  6. CMake基础 第8节 包含第三方库

    介绍# 几乎所有重要的项目都需要包含第三方库.头文件或程序.CMake支持使用find_package()函数查找这些工具的路径.这将从CMAKE_MODULE_PATH中的文件夹列表中搜索格式为Fi ...

  7. 学习C++:C++进阶(三)CMake基础篇---用一个小型项目了解CMake及环境构建

    V1.1 于2022年7月15日第二次修改:添加了比较多的解释图,解读了各类库的CMakelist.txt文件 目录 第一部分 基础篇(Basics) 1.0 本部分主要学什么(Intro) 1.1 ...

  8. 现代 CMake 简明教程(一)- CMake 基础

    系列文章目录 现代 CMake 简明教程(一)- CMake 基础 现代 CMake 简明教程(二)- 设计理念与使用 文章目录 系列文章目录 前言 CMake 基础 1. Modern CMake ...

  9. 【C++基础】【集成编译环境01】Clion的C++编译环境和Boost Test Framworks框架运行实践

    本文项目源码链接: CLionboostunittestframeworks项目源码-C++文档类资源-CSDN文库 前言和行文思路: VScode.Clion.Pycharm都是集成环境的编辑器,他 ...

最新文章

  1. jsonStore加载远程和本地数据实例
  2. 依赖注入及AOP简述(五)——依赖注入的方式 .
  3. SAP UI5 应用开发教程之五十七 - 基于 OData 注解的 Smart Field 使用方法学习试读版
  4. WPF 分页控件的简单实现
  5. guava读取配置文件_使用Guava MapSplitters配置Hadoop
  6. 深度学习(1)---2017年深度学习NLP重大进展与趋势
  7. Hbase KeyValue结构详解
  8. Microsoft Dynamic CRM 自定义重复检测功能
  9. Linux 从查看本机地址到端口映射
  10. 锐起无盘服务器改dns,锐起无盘多配置教程-菜鸟版(老鸟飘过)
  11. AVOD阅读笔记(一):摘要+特征提取----Aggregate View Obeject Detection network
  12. AIC准则选三个变量的r语言代码
  13. Android/ios/h5 三步调起QQ群聊,一键加群
  14. HDU 3533 Escape(BFS)
  15. python哪个字体好看_Python实现对比不同字体中的同一字符的显示效果
  16. jq中的addClass()方法与样式冲突
  17. 区块链、通证与供应链风险管理适应性分析研究
  18. 数据结构:单链表包含(归并)
  19. html5 微信获取当前位置,「微信小程序」实现获取当前位置并在地图上显示
  20. 燕麦冬食补益脾肾、降脂降压

热门文章

  1. zabbix如何选择适合的监控类型(107)
  2. PowerShell使用
  3. [知识图谱实战篇] 二.Json+Seaborn可视化展示电影实体
  4. C# 基础知识 (三).主子对话框数值传递
  5. Python之打造专属Python开发者的完美终端工具Rich
  6. 最短路径(Shortest Paths)
  7. python实现高效率的排列组合算法
  8. ASCII码八、十、十六进制对照表
  9. LeetCode 92. Reverse Linked List II
  10. 1027:输出浮点数