CMake简介
CMake是个一个开源的跨平台自动化建构系统,用来管理软件建置的程序,并不依赖于某特定编译器,并可支持多层目录、多个应用程序与多个库。 它用配置文件控制建构过程(build process)的方式和Unix的make相似,只是CMake的配置文件取名为CMakeLists.txt。CMake并不直接建构出最终的软件,而是产生标准的建构档(如Unix的Makefile或Windows Visual C++的projects/workspaces),然后再依一般的建构方式使用。
在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:
- 编写 CMake 配置文件 CMakeLists.txt
- 执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile(ccmake 和 cmake 的区别在于前者提供了一个交互式的界面)。其中, PATH 是 CMakeLists.txt 所在的目录
- 使用 make 命令进行编译
使用举例
目录结构:
./Demo
|
+--- main.cc
|
+--- sub/
|
+--- SubFunctions.cc
|
+--- SubFunctions.h
根目录中的 CMakeLists.txt :
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 添加 sub 子目录
add_subdirectory(sub)
# 指定生成目标
add_executable(Demo main.cc)
# 添加链接库
target_link_libraries(Demo SubFunctions)
子目录中的 CMakeLists.txt:
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)
# 生成链接库
add_library (SubFunctions ${DIR_LIB_SRCS})
编译项目
在当前目录执行 cmake . ,得到 Makefile 后再使用 make 命令编译得到 Demo可执行文件
自定义编译选项
CMake 允许为项目增加编译选项,从而可以根据用户的环境和需求选择最合适的编译方案
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo4)
# 加入一个配置头文件,用于处理 CMake 对源码的设置
configure_file (
"${PROJECT_SOURCE_DIR}/config.h.in"
"${PROJECT_BINARY_DIR}/config.h"
)
# 是否使用自己的 DefineFunctions 库
option (USE_MYDEFINE
"Use provided implementation" ON)
# 是否加入 DefineFunctions 库
if (USE_MYDEFINE)
include_directories ("${PROJECT_SOURCE_DIR}/sub")
add_subdirectory (sub)
set (EXTRA_LIBS ${EXTRA_LIBS} SubFunctions)
endif (USE_MYDEFINE)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 指定生成目标
add_executable(Demo ${DIR_SRCS})
target_link_libraries (Demo ${EXTRA_LIBS})
- configure_file 命令用于加入一个配置头文件 config.h ,这个文件由 CMake 从 config.h.in 生成,通过这样的机制,将可以通过预定义一些参数和变量来控制代码的生成
- option 命令添加了一个 USE_MYMATH 选项,并且默认值为 ON
- USE_MYMATH 变量的值来决定是否使用我们自己编写的 MathFunctions 库
安装和测试
CMake 也可以指定安装规则,以及添加测试。这两个功能分别可以通过在产生 Makefile 后使用 make install 和 make test 来执行
网友评论