最近接触到一些工程上的代码,都是用cmake来编译的,每次看着CMakeLists.txt 就各种懵逼,决定从0 开始学习 1 set set(var hello) message(${var}) 输出 hello 其实并不是单单输出hello,还有很多其他信息,会生成很多文件 files 2 CMAKE_C(XX)_FLAGS 变量 CMAKE_C_FLAGS 存放的内容会被传给 C 编译器,作用在所有的编译组态上。如果希望只针对特定一种组态有效,可以设定 CMAKE_C_FLAGS_<编译组态>,例如 CMAKE_C_FLAGS_RELEASE、CMAKE_C_FLAGS_DEBU CMake 是一个跨平台的构建系统,用于管理项目的构建过程,尤其适合多语言和多配置的项目。在本文中,我们将深入探讨CMake的基本概念、关键指令和变量,以及如何利用它来设置编译选项。 让我们从 `set` 指令开始。`set` 用于设置变量,例如 `set(var hello)` 创建了一个名为 `var` 的变量并将其值设置为 `hello`。当在 CMakeLists.txt 中使用 `${var}` 时,将打印出 `hello`。然而,这不仅仅是简单的输出,CMake 会根据变量和指令生成构建过程所需的配置文件和其他信息。 接下来是 `CMAKE_C(XX)_FLAGS` 变量。`CMAKE_C_FLAGS` 用于存储传递给 C 编译器的选项,这些选项将在所有编译配置上生效。如果希望对特定配置(如 Debug 或 Release)有效,可以使用 `CMAKE_C_FLAGS_<编译组态>`,如 `CMAKE_C_FLAGS_DEBUG` 或 `CMAKE_C_FLAGS_RELEASE`。例如,我们可以设置 `-Wall -O3 -march=native -Wno-reorder` 这样的编译选项,以开启所有警告、优化级别3、使用当前处理器的架构并禁用重新排序警告。 CMake 中还有一些重要的内置变量,比如: - `CMAKE_C_COMPILER` 和 `CMAKE_CXX_COMPILER` 分别指定了 C 和 C++ 编译器。 - `CMAKE_C_FLAGS` 用于指定编译 C 文件时的额外选项,同时 `add_definitions` 也可以用来添加编译选项。 - `EXECUTABLE_OUTPUT_PATH` 和 `LIBRARY_OUTPUT_PATH` 分别定义了可执行文件和库文件的输出路径。 - `CMAKE_BUILD_TYPE` 控制构建类型,如 Debug、Release 等。 - `BUILD_SHARED_LIBS` 开关用于在共享库和静态库之间切换。 `CHECK_CXX_COMPILER_FLAG` 是一个实用的函数,用于检查 C++ 编译器是否支持特定的编译标志。在给定的示例中,它用于检测 `-std=c++11` 或 `-std=c++0x` 是否可用,并根据结果设置相应的编译选项。 `add_definitions` 指令用于全局添加预处理定义,如 `-DDEBUG`,这样我们就可以在源文件中根据 `DEBUG` 宏进行条件编译。 `list` 函数是 CMake 中处理列表的重要工具。`list(LENGTH <list> <output variable>)` 返回列表的长度,`list(GET <list> <element index> <output variable>)` 用于获取列表中的元素,`list(APPEND <list> <element> ...)` 用于向列表追加元素,而 `list(FIND <list> <value> <output variable>)` 用于查找列表中特定值的索引。 `ENV` 语法允许我们访问和使用环境变量,如 `IF(DEFINED ENV{ARM_ARCHITECTURE})` 来判断当前是否为 ARM 架构的机器。 总结来说,CMake 提供了一套强大且灵活的机制来管理项目构建。通过理解 `set`、`CMAKE_C(XX)_FLAGS`、内置变量和 `list` 等指令,我们可以有效地配置和定制项目的编译过程,确保其在不同平台上正确、高效地运行。学习 CMake 不仅能够提高项目构建的效率,还能使开发者更好地控制编译选项,适应不同的开发需求。
- 粉丝: 9
- 资源: 901
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 所有算法均用 Python 实现.zip
- redis-standalone.yml redis k8s单点部署
- Python基于Scrapy兼职招聘网站爬虫数据分析设计(源码)
- zipkin.yml zipkin k8s部署
- YY9706.102-2021医用电气设备第2-47部分
- 通过运用时间序列ARIMA模型与循环神经网络(LSTM)对中国包装机器数量进行预测(python源码)
- Ruby编程基础与进阶指南
- 基于ARIMA模型的股票预测(python源码)
- 基于阿里云对象存储的对文件进行批量修改、批量解冻、批量上传
- 山东联通-海信IP501H-GK6323V100C-1+8G-4.4.2-当贝桌面-卡刷包
评论5