一、背景

我们知道cpp文件生成可执行文件exe步骤为:

1.用编辑器编写源代码,如.cpp文件

2.用编译器比如gcc编译代码生成目标文件,如.o

3.用链接器连接目标代码生成可执行文件,如.exe或.a文件

如果cpp文件太多,那么使用gcc编译就太麻烦了。我们可以使用CMake来实现上面的功能,而不是直接使用gcc编译命令,CMake编译的流程如下图所示

先编写统一的CmakeLists.txt文件,再生成与各平台相关的make文件,最后执行make指令。注意,Cmake是根据目录层级来生成make文件的,所以,必须在每个子目录中编写CmakeLists.txt文件 。

二、CMake的使用步骤 

在Linux下编译命令

mkdir build
cd build
cmake ..
make

windows下建议使用如下编译命令

mkdir build
cd build
cmake ../
make

本文的demo都是在windows下,使用gcc测试。

注意:如果你已经安装了vs2017,但是要使用gcc的话,windows下就不要直接使用cmake .. ,因为你装了vs2017,会自动生成vs的工程。如图所示

而是应该使用

cmake -G"Unix Makefiles" ../

生成的文件如下

 以下测试的工程路径为

GitHub - wzpan/cmake-demo: 《CMake入门实战》源码

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

目录结构如下

 MakeFile文件

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)

# 项目信息
project (Demo2)

# 查找目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

# 指定生成目标
add_executable(Demo ${DIR_SRCS})

运行结果

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

目录结构如下

 根目录的MakeFile

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)

# 项目信息
project (Demo3)

# 查找目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

# 添加 math 子目录
add_subdirectory(math)

# 指定生成目标
add_executable(Demo ${DIR_SRCS})

# 添加链接库
target_link_libraries(Demo MathFunctions)

 子目录的MakeFile

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)

# 指定生成 MathFunctions 链接库
add_library (MathFunctions ${DIR_LIB_SRCS})

五、自定义编译选项

文件目录

CMake 允许为项目增加编译选项,从而可以根据用户的环境和需求选择最合适的编译方案。

例如,可以将 MathFunctions 库设为一个可选的库,如果该选项为 ON ,就使用该库定义的数学函数来进行运算。否则就调用标准库中的数学函数库。

修改 CMakeLists 文件

我们要做的第一步是在顶层的 CMakeLists.txt 文件中添加该选项:

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)

# 项目信息
project (Demo4)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

# 是否使用自己的 MathFunctions 库
option (USE_MYMATH
	   "Use provided math implementation" ON)

# 加入一个配置头文件,用于处理 CMake 对源码的设置
configure_file (
  "${PROJECT_SOURCE_DIR}/config.h.in"
  "${PROJECT_BINARY_DIR}/config.h"
  )

# 是否加入 MathFunctions 库
if (USE_MYMATH)
  include_directories ("${PROJECT_SOURCE_DIR}/math")
  add_subdirectory (math)
  set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

# 指定生成目标
add_executable (Demo ${DIR_SRCS})
target_link_libraries (Demo  ${EXTRA_LIBS})

编写 config.h.in 文件

上面的程序值得注意的是第2行,这里引用了一个 config.h 文件,这个文件预定义了 USE_MYMATH 的值。但我们并不直接编写这个文件,为了方便从 CMakeLists.txt 中导入配置,我们编写一个 config.h.in 文件,内容如下:

 
#cmakedefine USE_MYMATH

这样 CMake 会自动根据 CMakeLists 配置文件中的设置自动生成 config.h 文件。

参考:

CMake 入门实战 | HaHack
CMake使用教程_Helen的博客 VR开发者交流群:538874606-CSDN博客

windows+CMake+mingw 搭建c c++开发环境 - herelsp - 博客园

CMake的安装及示例_$好记性还是要多记录$-CSDN博客_安装cmake

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐