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

cmake教程一

1. Start

1.1 构建简单工程

cmake_minimum_required(VERSION 3.0)
project(Step1)
add_executable(Step1 main.cpp)
  • 设置cmake最低版本要求
  • 设置工程名字
  • 设置工程生成可执行程序

2. 声明 C++ Standard

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
  • 如果我们用到了c++11新特性,就需要在CMakeLists.txt中增加CXX标准的声明,注意需要在add_executable()之前。

3. 声明版本和配置头文件

有时候我们需要一个变量定义在CMakeLists.txt中,而在源文件中又想使用这个变量。其中一种实现方式是通过可配置的头文件。config.h.in 是一个用于生成配置头文件的模板文件,通常用来定义一些编译时配置的宏。具体步骤如下:

3.1 创建 config.h.in 文件

首先,创建一个 config.h.in 文件,它通常包含一些占位符,将来会被 CMake 用于生成实际的 config.h 文件。例如:

/* config.h.in.  Generated from configure.ac by autoheader.  *//* Define to 1 if you have the <unistd.h> header file. */
#cmakedefine HAVE_UNISTD_H/* Define the version number */
#define VERSION "@PACKAGE_VERSION@"

3.2 在 CMakeLists.txt 中配置 CMake

CMakeLists.txt 文件中,配置 CMake 以使用 config.h.in 文件生成实际的 config.h 文件。这通常涉及以下几个步骤:

3.2.1 添加 config.h.in 文件

configure_file(config.h.in config.h)

configure_file 命令会将 config.h.in 文件处理成 config.h 文件。占位符(如 @PACKAGE_VERSION@)会被相应的值替换。

3.2.2 设置 CMake 变量

你可以使用 set 命令在 CMake 中定义一些变量,这些变量会被替换到 config.h 文件中。例如:

set(PACKAGE_VERSION "1.0.0")

3.2.3 配置 CMakeLists.txt

一个完整的例子可能如下所示:

cmake_minimum_required(VERSION 3.10)
project(MyProject)# 设置一些变量
set(PACKAGE_VERSION "1.0.0")# 配置生成 config.h 文件
configure_file(config.h.in config.h)# 添加源文件和可执行文件
add_executable(my_executable main.cpp)# 包含生成的 config.h 文件的路径
target_include_directories(my_executable PRIVATE ${CMAKE_CURRENT_BINARY_DIR})

3.3 使用 config.h 文件

在你的源代码中,包含 config.h 文件,以便使用在 config.h.in 中定义的宏:

#include "config.h"#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endifint main() {// 使用 VERSION 宏std::cout << "Version: " << VERSION << std::endl;return 0;
}

3.4 生成和构建项目

运行 CMake 以生成构建系统,并编译你的项目。你可以在构建目录中执行以下命令:

cmake ..
make

总结

  1. 创建 config.h.in:定义你想要的宏和占位符。
  2. 配置 CMake:在 CMakeLists.txt 中使用 configure_file 命令生成 config.h 文件。
  3. 设置变量:在 CMake 中设置你希望在 config.h 中定义的宏的值。
  4. 使用 config.h:在源代码中包含并使用这些宏。

这样,你可以灵活地控制代码中不同的配置选项,并使得你的项目能够根据不同的构建配置进行调整。

http://www.lryc.cn/news/429384.html

相关文章:

  • 3D场景标注标签信息,three.js CSS 2D渲染器CSS2DRenderer、CSS 3D渲染器CSS3DRenderer(结合react)
  • C++参悟-单例模式
  • 【题解】—— LeetCode一周小结32
  • 详解线索分层的目的、维度与创新实践
  • 于8月21号的回顾
  • Abstract Class抽象类
  • webrtc ns 降噪之粉红噪声参数推导
  • IO进程线程8月21日
  • Web安全:SqlMap工具
  • 用手机写一本电子书
  • 【网络编程】基于UDP的TFTP文件传输
  • Vue 3 + Pinia 实现网页刷新功能
  • DVWA综合靶场漏洞讲解
  • 实现Bezier样条曲线
  • MySQL中的EXPLAIN的详解
  • LearnOpenGL——SSAO学习笔记
  • [C语言]-基础知识点梳理-文件管理
  • pcdn闲置带宽被动收入必看教程。第五讲:光猫更换和基础设置
  • 工业数据采集网关简介-天拓四方
  • Java 调整字符串,验证码生成
  • 【专题】全球商用服务机器人市场研究(2023)报告合集PDF分享(附原数据表)
  • SQL UA注入 (injection 第十八关)
  • 初阶数据结构之计数排序
  • 【开端】记一次诡异的接口排查过程
  • jenkins最佳实践(二):Pipeline流水线部署springCloud微服务项目
  • 第2章 C语言基础知识
  • 鹭鹰优化算法SBOA优化RBF神经网络的扩散速度实现多数入多输出数据预测,可以更改数据集(MATLAB代码)
  • MySQL基础练习题48-连续出现的数字
  • webrtc学习笔记2
  • Simple RPC - 06 从零开始设计一个服务端(上)_注册中心的实现