本CMake系列是依据github上的cmake-examples进行翻译总结。同时对于不懂的地方进行总结与标注。希望本系列能节省你学习CMake的时间。

学习方式是在实践中利用github上的example学习,同时对于不懂的地方主要通过翻译官方手册学习,其次是查找博客上的私人理解。

因为每一个example都是一个工程,所以讲解时会利用文件树解释每一个文件里的语法。

CMake在线阅读电子书

文章目录

  • 一 文件树
    • 1.1 main.cpp
    • 1.2 CMakeLists.txt
  • 二 CMake解析
    • 2.1 设置每个目标编译标志
    • 2.2 设置默认编译标志
    • 2.3 设置CMake标志
    • 2.4 区别
  • 三 构建示例
  • 微信公众号

首先说一下什么是编译标志(或者 叫编译选项)。可执行文件的生成离不开编译和链接,那么如何编译,比如编译时使用C++的哪一个标准?这些编译设置都在CMAKE_CXX_FLAGS变量中。(C语言编译选项是CMAKE_C_FLAGS)

设置的方法总共有三种,分别为本文2.1、2.2、以及2.3

一 文件树

├── CMakeLists.txt
├── main.cpp

1.1 main.cpp

#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;
}

1.2 CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
#强制设置默认C++编译标志变量为缓存变量,如CMake(五) build type所说,该缓存变量被定义在文件中,相当于全局变量,源文件中也可以使用这个变量
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEX2" CACHE STRING "Set C++ Compiler Flags" FORCE)project (compile_flags)add_executable(cmake_examples_compile_flags main.cpp)
#为可执行文件添加私有编译定义
target_compile_definitions(cmake_examples_compile_flags PRIVATE EX3
)
#命令的具体解释在二  CMake解析中,这里的注释只说明注释后每一句的作用

二 CMake解析

2.1 设置每个目标编译标志

在现代CMake中设置C ++标志的推荐方法是专门针对某个目标(target)设置标志,可以通过target_compile_definitions()函数设置某个目标的编译标志。

target_compile_definitions(cmake_examples_compile_flagsPRIVATE EX3
)

如果这个目标是一个库(cmake_examples_compile_flags),编译器在编译目标时添加定义-DEX3 ,并且选择了范围PUBLIC或INTERFACE,该定义-DEX3也将包含在链接此目标(cmake_examples_compile_flags)的所有可执行文件中。 注意,本语句使用了PRIVATE,所以编译选项不会传递。

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

target_compile_definitions(<target>
2   <INTERFACE|PUBLIC|PRIVATE> [items1...]
3   [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

是给 target 添加编译选项, target 指的是由 add_executable()产生的可执行文件或 add_library()添加进来的库。<INTERFACE|PUBLIC|PRIVATE>指的是[items...] 选项可以传播的范围, PUBLIC and INTERFACE会传播 <target>的 INTERFACE_COMPILE_DEFINITIONS 属性, PRIVATE and PUBLIC 会传播 target 的 COMPILE_DEFINITIONS 属性。

2.2 设置默认编译标志

默认的CMAKE_CXX_FLAGS为空或包含适用于构建类型的标志。 要设置其他默认编译标志,如下使用:

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

强制设置默认C++编译标志变量为缓存变量,如CMake(五) build type所说,该缓存变量被定义在文件中,相当于全局变量,源文件中也可以使用这个变量。这个变量原本包含的参数仍然存在,只是添加了EX2。

CACHE STRING "Set C++ Compiler Flags" FORCE命令是为了强制将CMAKE_CXX_FLAGS变量 放到CMakeCache.txt文件中

"${CMAKE_CXX_FLAGS} -DEX2"这个字符串可以保留原有的CMAKE_CXX_FLAGS中的参数,额外添加了一个EX2参数。注意写法:空格,并且参数前加了-D

类似设置CMAKE_CXX_FLAGS,还可以设置其他选项:

  • 设置C编译标志: CMAKE_C_FLAGS
  • 设置链接标志:CMAKE_LINKER_FLAGS.

2.3 设置CMake标志

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

  1. 利用ccmake或者gui

  2. 在cmake命令行中:

    cmake .. -DCMAKE_CXX_FLAGS="-DEX3"
    

2.4 区别

  • 2.2方法的设置CMAKE_C_FLAGS和CMAKE_CXX_FLAGS将为该目录或所有包含的子目录中的所有目标全局设置一个编译器标志。 现在不建议使用该方法,首选使用target_compile_definitions函数。
  • 2.1方法是被建议的,只为这个目标设置编译选项 。
  • 2.3设置的也是全局编译器选项。

三 构建示例

$ 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

微信公众号

欢迎大家关注我的个人公众号,现阶段主要总结Robomaster相关的计算机视觉知识:Qt,C++,CMake,OpenCV等等
公众号名称:三丰杂货铺

RoboMaster视觉笔记CMake(六) Compile Flags相关推荐

  1. 视觉SLAM十四讲学习笔记-第六讲-非线性优化的实践-高斯牛顿法和曲线拟合

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

  2. 视觉SLAM十四讲学习笔记-第六讲学习笔记总结(1)---非线性优化原理

    第六讲学习笔记如下: 视觉SLAM十四讲学习笔记-第六讲-非线性优化的状态估计问题_goldqiu的博客-CSDN博客 ​​​​​​视觉SLAM十四讲学习笔记-第六讲-非线性优化的非线性最小二乘问题_ ...

  3. 视觉SLAM十四讲学习笔记-第六讲-非线性优化的非线性最小二乘问题

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

  4. Robomaster视觉组成长之路

    Robomaster视觉组成长之路 本文目录 Robomaster视觉组成长之路 前言 11.28 看装甲板 11.30 Source Insight和wine 东南大学代码 apt安装qt5 err ...

  5. OpenCV学习笔记(六)(七)(八)(九)(十)

    OpenCV学习笔记(六)--对XML和YAML文件实现I/O操作 1. XML.YAML文件的打开和关闭 XML\YAML文件在OpenCV中的数据结构为FileStorage,打开操作例如: [c ...

  6. getvalue参数计数不匹配_OpenCV开发笔记(六十八):红胖子8分钟带你使用特征点Flann最邻近差值匹配识别...

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  7. nrf52832 学习笔记(六)配对和绑定

    nrf52832 学习笔记(六)配对和绑定 配对绑定推荐博客低功耗蓝牙配对绑定解读和实践 蓝牙在配对之前都是明文通信的,也就是说主从机之间传输的数据包可以被第三方抓取分析逆向,而且如果没有配对,谁都可 ...

  8. RoboMaster视觉教程(6)目标位置解算(PnP求解目标与摄像头间的相对位置)

    RoboMaster视觉教程(6)目标位置解算(PnP求解目标与摄像头间的相对位置) 概览 算法原理 solvePnP的使用流程 实验:测量二维码相对于摄像头的位置 RoboMaster视觉程序中的位 ...

  9. 深度学习入门笔记(六):浅层神经网络

    专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分 ...

  10. RoboMaster视觉教程(4)装甲板识别算法

    RoboMaster视觉教程(4)装甲板识别算法 概览 下面是一些资料链接,篇篇经典! 装甲板识别 test_sentry.cpp 分析一下装甲板 识别函数 int ArmorDetector::de ...

最新文章

  1. 高德地图POI搜索,附近地图搜索,类似附近的人搜索
  2. 【ACM】【STL】stack应用
  3. springmvc集成oracle,SpringMVC整合druid
  4. django-admin.py 不是内部或外部命令
  5. JavaScript文档DOM对象处理HTML→document属性方法、write、getElementBy**、getsetAttribute、节点操作方法、innerHTML、操作CSS样式属性
  6. Atitit 全文检索 pgsql 艾提拉总结 分词 全文索引的实现要靠 PgSQL 的 gin 索引。分词功能 PgSQL 内置了英文、西班牙文等,但中文分词需要借助开源插件 zhparser;
  7. R语言基础期末大作业
  8. 11.scrapy框架持久化存储
  9. 甘肃教育杂志甘肃教育杂志社甘肃教育编辑部2022年第15期目录
  10. ubuntu系统为firefox浏览器安装flash插件
  11. matlab植物大战僵尸小游戏
  12. 电脑上如何进行MP4格式转换成其它格式?
  13. 关于SYS/BIOS
  14. 基于Arduino开发的智能小车
  15. matlab 花体字母,小论文格式模板.doc
  16. 思维导图告诉你怎样正确的做笔记?
  17. 【微信小程序】引用echarts 在真机上预览图表模糊的解决办法
  18. 【数据库】编写存储过程
  19. ubuntu VCS+verdi安装教程
  20. Python之Flask框架(一)

热门文章

  1. FlashFXP使用及连接不上的错误问题
  2. 桌面计算机地址栏在哪,我的电脑地址栏不见了怎么办 地址栏不见了如何解决...
  3. COGS 577 蝗灾
  4. c语言程序设计基础计算存款利息,《C语言及程序设计》实践参考——定期存款利息计算器...
  5. [C#]Windows服务程序[转载西门吹雪的好文章]
  6. 若已知1800年1月1日为星期3,则对于一个给定的年份和月份,输出这个月的最后一天是星期几。
  7. [ecshop 资料]ecshop积分充值可充值等级积分余消费积分教程 pay_points
  8. python分支结构与循环结构
  9. ubuntu rar解压缩
  10. 【EDM邮件营销】独立站卖家如何通过用户标签提高EDM邮件打开率