CMake 入门教程
简介
CMake 是一个构建工程的工具
测试环境
- Ubuntu 18.04 LTS
- CMake 3.10.2
安装
$ sudo apt install cmake
使用
-
在指定目录下写 CMakeLists.txt,文件名区分大小写
-
创建并切换到构建目录
$ mkdir -p build
$ cd build
- 设置安装前缀,生成 Makefile
$ cmake -DCMAKE_INSTALL_PREFIX=/usr ..
- 编译
$ make
- 测试(可选)
$ make test
- 安装(可选)
$ make install
说明:内部编译会导致文件结构混乱,因此推荐外部构建
CMake 常用命令
CMake 命令不区分大小写,以下说明均用小写字母说明
- 指定 CMake 的最小版本
cmake_minimum_required(VERSION min-version)
- 指定项目名称
project(project-name)
- 向用户输出提示信息
message(STATUS "message to display")
- 向用户输出错误信息,构建直接停止
message(FATAL_ERROR "message to display")
- 添加子目录
add_subdirectory(source-dir)
- 添加头文件的搜索目录
include_directories(include-dir)
- 添加动态库的搜索目录
link_directories(library-dir)
- 构建二进制文件
add_executable(executable-name source.cc)
- 对二进制文件添加链接的库文件
target_link_libraries(executable-name library-name)
- 设置二进制文件的输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
- 构建动态库
add_library(library-name SHARED source.cc)
- 设置动态库的输出目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib)
- 构建静态库
add_library(library-name STATIC source.cc)
- 设置静态库的输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib)
- 同时构建动态库和静态库
add_library(library-name-shared SHARED source.cc)
add_library(library-name-static STATIC source.cc)
set_target_properties(library-name-shared PROPERTIES
OUTPUT_NAME library-name) # 设置库文件的输出名字
set_target_properties(library-name-static PROPERTIES
OUTPUT_NAME library-name) # 设置库文件的输出名字
- 设置动态库的版本
set_target_properties(library-name-shared PROPERTIES
VERSION 1.2 # 设置动态库的版本
SOVERSION 1) # 设置 API 版本
- 设置需要安装的文件
install(TARGETS executable-name library-name-shared library-name-static
RUNTIME DESTINATION bin # 设置二进制文件的安装目录
LIBRARY DESTINATION lib # 设置动态库的安装目录
ARCHIVE DESTINATION lib) # 设置静态库的安装目录
install(FILES hearder-name.h DESTINATION include) # 设置普通文件的安装目录
- 激活测试命令
enable_testing()
- 添加测试程序
add_test(test-name executable-name arg)
- 设置变量的值,如果有多个值,将以分号分割,例如:如果设置 set(var a b c),${var} 的值将为:"a;b;c"
set(variable-name value)
CMake 常用变量
CMake 变量区分大小写
- 项目名称
CMAKE_PROJECT_NAME
- 项目的源目录
CMKAE_SOURCE_DIR
- 项目的构建目录
CMKAE_BINARY_DIR
- 安装目录前缀
CMAKE_INSTALL_PREFIX
- C++ 编译选项
CMAKE_CXX_FLAGS
CMake 常用控制指令
- 判断变量是否定义
if(val)
command()
endif(val)
- 判断变量是否未定义
if(not val)
command()
endif(not val)