一、背景
我们知道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 文件,内容如下:
|
这样 CMake 会自动根据 CMakeLists 配置文件中的设置自动生成 config.h 文件。
参考:
CMake 入门实战 | HaHack
CMake使用教程_Helen的博客 VR开发者交流群:538874606-CSDN博客