CMakeLists.txt入门介绍

本文最后更新于:2023年3月15日 中午

1 cmake常用命令

1.1 指定cmake的最小版本(可选)

1
cmake_minimum_required(VERSION 3.4.1)

如果CMakeLists.txt文件中使用了一些高版本cmake特有的一些命令的时候,需要加上这行命令,提醒用户升级到该版本之后再执行cmake。

1.2 设置项目名称(可选)

1
project(test)

这个命令不是强制性的,但是最好都加上。

它会引入两个变量test_BINARY_DIRtest_SOURCE_DIR,同时,cmake自动定义了两个等价的变量PROJECT_BINARY_DIRPROJECT_SOURCE_DIR

1.3 设置编译类型

1
2
3
add_executable(test test.cpp) # 生成可执行文件
add_library(compare STATIC compare.cpp) # 生成静态库
add_library(compare SHARED compare.cpp) # 生成动态库或共享库

通过以上命令生成文件名字,

在Linux下是:

在Windows下是:

  • test.exe
  • compare.lib
  • compare.dll

1.4 指定编译包含的源文件

1.4.1 明确指定包含哪些源文件

1
add_library(test test.cpp test1.cpp test2.cpp)

1.4.2 搜索所有的源文件

1
2
aux_source_directory(. SRC_LIST) # 搜索当前目录下的所有.cpp文件
add_library(test ${SRC_LIST})

1.4.3 搜索所有的.c和.cpp源文件

1
2
aux_source_directory(GLOB_RECURSE SRC_LIST *.cpp *.c) # 搜索当前目录下的所有.cpp文件
add_library(test ${SRC_LIST})

1.5 设置包含的目录

1
include_directories(${PROJECT_SOURCE_DIR})

1.6 设置链接库搜索目录

1
link_directories(${PROJECT_SOURCE_DIR}/build)

1.7 设置target需要链接的库

1
2
3
4
target_link_libraries( # 目标库
demo
# 目标库需要链接的库
XXX)

1.8 设置变量

1.8.1 set直接设置变量的值

1
2
set(SRC_LIST main.cpp test.cpp)
add_executable(test ${SRC_LIST})

1.8.2 set追加设置变量的值

1
2
3
set(SRC_LIST main.cpp)
set(SRC_LIST ${SRC_LIST} test.cpp)
add_executable(test ${SRC_LIST})

1.8.3 list追加或者删除变量的值

1
2
3
4
set(SRC_LIST main.cpp)
list(APPEND SRC_LIST test.cpp)
list(REMOVE_ITEM SRC_LIST main.cpp)
add_executable(test ${SRC_LIST})

2 常用变量

2.1 预定义变量

  • PROJECT_SOURCE_DIR:工程的根目录
  • PROJECT_BINARY_DIR:运行 cmake 命令的目录,通常是${PROJECT_SOURCE_DIR}/build
  • PROJECT_NAME:返回通过 project 命令定义的项目名称
  • CMAKE_CURRENT_SOURCE_DIR:当前处理的 CMakeLists.txt 所在的路径
  • CMAKE_CURRENT_BINARY_DIR:target 编译目录
  • CMAKE_CURRENT_LIST_DIR:CMakeLists.txt 的完整路径
  • CMAKE_CURRENT_LIST_LINE:当前所在的行
  • CMAKE_MODULE_PATH:定义自己的 cmake 模块所在的路径,SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令来调用自己的模块
  • EXECUTABLE_OUTPUT_PATH:重新定义目标二进制可执行文件的存放位置
  • LIBRARY_OUTPUT_PATH:重新定义目标链接库文件的存放位置

2.2 环境变量

使用环境变量

1
$ENV{Name}

写入环境变量

1
set(ENV{Name} value) # 这里没有“$”符号

2.3 系统信息

  • CMAKE_MAJOR_VERSION:cmake 主版本号,比如 3.4.1 中的 3
  • CMAKE_MINOR_VERSION:cmake 次版本号,比如 3.4.1 中的 4
  • CMAKE_PATCH_VERSION:cmake 补丁等级,比如 3.4.1 中的 1
  • CMAKE_SYSTEM:系统名称,比如 Linux-2.6.22
  • CMAKE_SYSTEM_NAME:不包含版本的系统名,比如 Linux
  • CMAKE_SYSTEM_VERSION:系统版本,比如 2.6.22
  • CMAKE_SYSTEM_PROCESSOR:处理器名称,比如 i686
  • UNIX:在所有的类 UNIX 平台下该值为 TRUE,包括 OS X 和 cygwin
  • WIN32:在所有的 win32 平台下该值为 TRUE,包括 cygwin

2.4 主要开关选项

  • BUILD_SHARED_LIBS:这个开关用来控制默认的库编译方式,如果不进行设置,使用add_library又没有指定库类型的情况下,默认编译生成的库都是静态库。如果set(BUILD_SHARED_LIBS ON后,默认生成的为动态库
  • CMAKE_C_FLAGS:设置 C 编译选项,也可以通过指令add_definitions()添加
  • CMAKE_CXX_FLAGS:设置 C++ 编译选项,也可以通过指令add_definitions()添加

3 示例

3.1 单个源文件

只有一个main.c源文件,内容如下:

1
2
3
4
5
6
#include <iostream>

int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}

编写CmakeLists.txt文件如下:

1
2
3
4
5
6
7
8
9
10
11
cmake_minimum_required(VERSION 3.23)

project(ctest)

# 设置C++标准
set(CMAKE_CXX_STANDARD 14)

# 设置可执行文件输出路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/Build)

add_executable(ctest main.cpp)

3.2 复杂项目

目录结构如下:

1
2
3
4
5
6
7
8
|
+--CMakeLists.txt
+--main.cpp
+--Box
|
+--box.h
+--box.cpp
+--CMakeLists.txt

其中,main.cpp、box.h、box.cpp 文件内容如下:

main.cpp:

1
2
3
4
5
6
7
8
#include <iostream>
#include "Box/box.h"

int main() {
Box box(1, 2, 3);
std::cout << box.getVolume() << std::endl;
}

box.h:

1
2
3
4
5
6
7
8
9
10
11
class Box {
public:
Box(int length, int width, int height);

int getVolume();

private:
int _length;
int _width;
int _height;
};

box.cpp:

1
2
3
4
5
6
7
8
9
10
11
#include "box.h"

Box::Box(int length, int width, int height) {
_length = length;
_width = width;
_height = height;
}

int Box::getVolume() {
return _length * _width * _height;
}

我们将Box类编译成库文件,供主程序调用,主目录CMakeLists.txt内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cmake_minimum_required(VERSION 3.23)

project(ctest)

# 设置C++标准
set(CMAKE_CXX_STANDARD 14)

# 设置可执行文件输出路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/Build)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/Build)

# 添加子目录
add_subdirectory(Box)

add_executable(ctest main.cpp)

# 链接库
target_link_libraries(ctest box)

Box文件夹下的CMakeLists.txt如下:

1
add_library(box STATIC box.cpp)

参考文章: CMakeLists.txt 语法介绍与实例演练_阿飞__的博客-CSDN博客_cmakelist


CMakeLists.txt入门介绍
https://summersong.top/post/e5ddafc7.html
作者
SummerSong
发布于
2022年8月29日
更新于
2023年3月15日
许可协议