Cmake学习笔记

注释

单行注释

CMake中使用#进行单行注释

1
2
# 这是一个行注释
cmake_minimum_required(VERSION 3.0.0)

多行注释

CMake中使用#[[]]进行多行注释

1
2
3
4
#[[这是一个多行注释
这是一个行注释
这是一个行注释]]
cmake_minimum_required(VERSION 3.0.0)

单个源文件

目标:编写cpp文件,编译后输出Hellp world!

c_file

1
2
3
4
5
6
//main.cpp
#include<stdio.h>
int main(){
printf("Hello world!");
return 0;
}

CMakeLists.txt

1
2
3
4
5
6
7
8
#CMake要求的最低版本
cmake_minimum_required(VERSION 3.0.0)

#项目名称
project(Hello)

#指定生成目标
add_executable(Hello main.cpp) #将main.cpp编译为Hello

文件结构

编译项目

生成Makefile

1
cmake . //CMakeLists.txt同一级目录下

此时生成了Makefile文件

生成目标文件

1
make //Makefile同一级目录下

生成了目标文件Hello

执行可执行文件

1
./Hello

多个源文件

目标:通过编写多个cpp文件,使其可以进行简单的计算

c_file

main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
//main.cpp
#include<stdio.h>
#include"head.h"
int main(){
int a=10,b=20;
printf("a:%d,b:%d\n",a,b);
printf("a+b:%d+%d=%d\n",a,b,add(a,b));
printf("a-b:%d-%d=%d\n",a,b,sub(a,b));
printf("a*b:%d*%d=%d\n",a,b,mult(a,b));
printf("b/a:%d/%d=%f\n",b,α,div(b,α));
return 0;
}

head.h

1
2
3
4
5
6
7
8
9
10
11
12
13
//head.h
#ifndef _HEAD_H
#define _HEAD_H

int add(int a,int b);

int sub(int a,int b);

int mult(int a,int b);

double div(int a,int b);

#endif

add.cpp

1
2
3
4
5
6
//add.cpp
#include<stdio.h>
#include "head.h"
int add(int a,int b){
return a+b;
}

sub.cpp

1
2
3
4
5
6
//sub.cpp
#include<stdio.h>
#include "head.h"
int sub(int a,int b){
return a-b;
}

mult.cpp

1
2
3
4
5
6
//mult.cpp
#include<stdio.h>
#include "head.h"
int mult(int a,int b){
return a*b;
}

div.cpp

1
2
3
4
5
6
//div.cpp
#include<stdio.h>
#include "head.h"
double div(int a,int b){
return a/b;
}

CMakeLists.txt

1
2
3
4
5
6

cmake_minimum_required(VERSION 3.0)

project(compute)

add_executable(compute_app main.cpp add.cpp sub.cpp mult.cpp div.cpp)#将所有的cpp文件都编译为compute的目标文件

但是这样太过繁琐,可以使用CMakeLists.txt中的aux_source_directory([dir][var])代替
[dir]:目录
[var]:变量名

1
2
3
4
5
6
7
8
cmake_minimum_required(VERSION 3.0)

project(compute)

#将所有当前文件夹的源文件都存储到DIR_SRCS变量中
aux_source_dorectory(. DIR_SRCS)

add_executable(compute_app ${DIR_SRCS})#将DIR_SRCS中所有的源文件都编译为computre_app的目标文件

文件结构

编译项目

生成Makefile

1
cmake .//与CMakeLists.txt同一级

生成Makefile

生成目标文件

1
make //与Makefile同一级目录

生成了一个目标文件

执行可执行文件

1
./compute_app

build目录

在当前项目下新建一个build目录,将源代码和编译的目标文件区分开来

多个源文件为例,通过创建build目录,将源代码和编译后的文件区分开来

创建build目录

编译项目

生成Makefile文件

进入build目录

1
cmake ..

现在的编译相关的文件都生成在了build目录中

生成目标文件

还是在build目录中

1
make

执行可执行文件

build目录中

1
./compute_app

子目录下的编译

main.cpp和其他函数实现部分区分开,函数部分单独作为一个静态库去实现

这样便需要在main.cpp的同级目录下编写一个CMakeLists.txt,函数部分的目录中同时也要编写一个CMakeLists.txt

文件结构

CMakeLists.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#./CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)

project(compute)

aux_source_directory(. DIR_SRCS)

# 添加子目录
add_subdiretory(options)

add_executable(compute_app ${DIR_SRCS})

# 添加链接库,连接到options静态库
target_link_diraries(compute_app options)
1
2
3
4
5
6
7
8
9
#./options/CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)

project(options)

aux_source_directory(. DIR_LIB_SRCS)

add_library(options ${DIR_LIB_SRCS})

编译项目

生成makefile

在项目根目录和options目录中都要生成makefile
options目录中一定要生成makefilemake完毕之后去根目录下生成makefile文件

生成目标文件

在根目录下生成目标文件

1
make

完毕后的文件结构:

执行目标文件

1
./compute_app

Cmake学习笔记
http://www.ming-ice-tea.top/2025/04/26/Cmake学习笔记/
作者
John Doe
发布于
2025年4月26日
许可协议