undefined

https://www.hahack.com/codes/cmake/

cmake 使用

在 linux 下使用 cmake 生成 makefile 并编译的流程如下:

  • 编写 cmake 配置文件 CMakeList.txt
  • 执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile (ccmake 和 cmake 的区别在于前者提供了一个交互式界面)。其中 PATH 是 CMakefile.txt 所在的目录
  • 使用 make 命令进行编译

一、单个源文件

编写 CMakeList.txt 文件

1
2
3
4
5
6
# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.16)
# 项目信息
project(LearnTest)
# 将源文件编译成一个名为 LearnTest 的可执行文件,指定生成目标
add_executable(LearnTest test/new_test/main.cpp)

二、多个源文件

CMakeList.txt 文件

1
2
3
4
5
cmake_minimum_required(VERSION 3.14)
project(LearnTest)
# 查找目录下的所有源文件,并将名称保存在 DIR_SRCS 变量中
aux_source_directory(test/new_test/ DIR_SRCS)
add_executable(LearnTest ${DIR_SRCS})

三、多个目录,多个源文件

1
2
3
4
5
6
/LearnTest 
+--- main.cc
+--- math/
+--- MathFunctions.cc
+--- MathFunctions.h
+--- CMakeLists.txt
1
2
3
4
5
6
7
8
9
cmake_minimum_required(VERSION 3.14)
project(LearnTest)
# 设置c++ 版本为 11
set(CMAKE_CXX_STANDARD 11)
# 添加 math 子目录
add_subdirectory(math)
add_executable(LearnTest main.cpp)
# 添加链接库
target_link_libraries(LearnTest MathFunctions)
  • 使用命令 add_subdirectory 指明本项目包含一个子目录 math,这样 math 目录下的 CMakeLists.txt 文件和源代码也会被处理。
  • 使用 target_link_libraries 指明可执行文件 LearnTest 需要链接一个名为 MathFunctions 的链接库

子目录 math 中 CMakeLists.txt 文件如下

1
2
3
4
# 查看当前目录下的所有源文件,并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)
# 生成链接库,编译成静态链接库
add_library(MathFunctions ${DIR_LIB_SRCS})

四、安装

CMake 也可以指定安装规则,以及添加测试。这两个功能分别可以通过在产生 Makefile 后使用 make installmake test 来执行。在以前的 Makefile 中,可能需要为此编写 install 和 test 两个伪目标和相应的规则

五、支持 GDB

需要指定 Debug 模式下开启 -g 选项

1
2
3
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")