Cmake教程

Cmake介绍

Cmake是一个跨平台的的编译器,能够输出makefile和project文件

step 1

一个简单的项目的配置是CMakeList.txt是有三行组成:

cmake_minimum_required(VERSION 3.10)
# set the project name
project(Tutorial)
# add the executable
add_executable(Tutorial tutorial.cxx)

cmake_minimum_required:设置版本号

project:设置项目名称和版本号,

project(Tutorial VERSION 1.0)
configure_file(TutorialConfig.h.in TutorialConfig.h):

configure_file(<input> <output> [COPYONLY] [ESCAPE_QUOTES] [@ONLY] [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])

configure_file 主要实现如下两个功能:

  1. 将 <input> 文件里面的内容全部复制到 <output> 文件中;
  2. 根据参数规则,替换 @VAR@ 或 ${VAR} 变量;
  1. COPYONLY

    • 仅拷贝 <input> 文件里面的内容到 <output> 文件, 不进行变量的替换
  2. ESCAPE_QUOTES

    • 使用反斜杠(C语言风格)来进行转义;
  3. @ONLY

    • 限制替换, 仅仅替换 @VAR@ 变量, 不替换 ${VAR} 变量
  4. NEWLINE_STYLE

    • 指定输入文件的新行格式, 例如:Unix 中使用的是 \n, windows 中使用的 \r\n

**注意: ** COPYONLY 和 NEWLINE_STYLE 是冲突的,不能同时使用;

Config.h.in 文件内容



/**
 * This is the configure demo  
 *    - CMAKEDEFINE_VAR1 = @CMAKEDEFINE_VAR1@
 *    - CMAKEDEFINE_VAR2 = @CMAKEDEFINE_VAR2@
 *    - DEFINE_VAR1      = @DEFINE_VAR1@
 *    - DEFINE_VAR2      = @DEFINE_VAR2@
 */

/**
 *  cmakedefine 会根据变量的值是否为真(类似 if)来变换为 #define VAR ... 或  #undef VAR 
 */
#cmakedefine CMAKEDEFINE_VAR1 @CMAKEDEFINE_VAR1@
#cmakedefine CMAKEDEFINE_VAR2 @CMAKEDEFINE_VAR2@


/**
 * define 会直接根据规则来替换
 */
#define DEFINE_VAR1 @DEFINE_VAR1@
#define DEFINE_VAR2 ${DEFINE_VAR2}

**tutorial.cpp ** 文件内容


// 计算平方根的简单程序。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "Config.h"

int main (int argc, char *argv[]) {
  
#ifdef CMAKEDEFINE_VAR1
   fprintf(stdout,"CMAKEDEFINE_VAR1 = %d\n", CMAKEDEFINE_VAR1);
#endif 

#ifdef CMAKEDEFINE_VAR2
   fprintf(stdout,"CMAKEDEFINE_VAR2 = %d\n", CMAKEDEFINE_VAR2);
#endif 

#ifdef DEFINE_VAR1
   fprintf(stdout,"DEFINE_VAR1 = %d\n", DEFINE_VAR1);
#endif 

#ifdef DEFINE_VAR2
   fprintf(stdout,"DEFINE_VAR2 = %d\n", DEFINE_VAR2);
#endif 
 
  return 0;
}


make.sh 保存一些指令(这个非必须)

#!/bin/sh

# 删除一些产生的文件
rm -rf CMakeFiles
rm cmake_install
rm Makefile
rm Config.h
rm DEMO
rm CMakeCache.txt
rm -rf ./vscode
rm cmake_install.cmake

cmake ./
make

./DEMO

3.1 运行 sh make.sh

  • 生成一个 Config.h 配置文件,文件内容为:

/**
 * This is the configure demo  
 *    - CMAKEDEFINE_VAR1 = 1
 *    - CMAKEDEFINE_VAR2 = 0
 *    - DEFINE_VAR1      = 1
 *    - DEFINE_VAR2      = 0
 */

/**
 *  cmakedefine 会根据变量的值是否为真(类似 if)来变换为 #define VAR ... 或  #undef VAR 
 */
#define CMAKEDEFINE_VAR1 1
/* #undef CMAKEDEFINE_VAR2 */


/**
 * define 会直接根据规则来替换
 */
#define DEFINE_VAR1 1
#define DEFINE_VAR2 0


  • 终端显示:

.....

Scanning dependencies of target DEMO
[ 50%] Building CXX object CMakeFiles/DEMO.dir/tutorial.cpp.o
[100%] Linking CXX executable DEMO
[100%] Built target DEMO
CMAKEDEFINE_VAR1 = 1
DEFINE_VAR1 = 1
DEFINE_VAR2 = 0


四、参考链接

https://cmake.org/cmake/help/v3.14/command/configure_file.html?highlight=cmakedefine

 

### 关于 CMake教程、入门与使用指南 #### 初步认识 CMake CMake 是一种跨平台的自动化建构系统工具,它通过编写简单的脚本文件 `CMakeLists.txt` 来描述整个工程的所有目标以及它们之间的依赖关系。这使得开发者能够轻松管理项目的构建过程,在不同平台上保持一致的行为[^1]。 #### 安装最新版 CMake 对于某些操作系统如 CentOS 7,默认提供的 CMake 版本可能较为陈旧。为了获得更好的体验和支持更多特性,推荐安装较新版本的 CMake。可以通过 EPEL 仓库或者直接从源码编译的方式来完成升级操作[^3]。 #### 创建第一个 CMake 工程 创建一个新的目录作为工作空间,并在里面放置一个名为 `CMakeLists.txt` 的文本文件。此文件定义了项目的基本信息,比如名称、最低所需 CMake 版本号等基本信息: ```cmake # 设置最小 cmake 版本要求 cmake_minimum_required(VERSION 3.0) # 定义项目名及其默认语言 project(MyProject CXX) ``` 接着可以在该文件中继续添加其他必要的配置项,例如设置可执行文件的目标名称和要编译的源代码列表: ```cmake add_executable(myapp main.cpp utils.cpp) ``` 以上命令将会告诉 CMake 需要生成一个叫做 myapp 的应用程序,并且其对应的源文件为当前路径下的 main.cpp 和 utils.cpp 文件[^2]。 #### 控制流程结构 除了基本语法外,CMake 还提供了一些控制流语句来增强灵活性。例如,利用 `foreach()` 循环遍历变量列表中的每一个成员并对其做相应处理;也可以借助条件判断来进行分支逻辑的选择[^5]: ```cmake if(SOME_CONDITION) add_definitions(-DUSE_FEATURE_XYZ=ON) endif() ``` 上述例子展示了如何根据特定条件下启用某个预处理器宏定义。 #### 探索更多功能 随着对基础知识的理解加深,可以探索更复杂的功能,像自动生成头文件、集成测试框架或是调用外部库的支持等功能都可以通过查阅官方文档深入了解[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值