本教程的测试环境
- Ubuntu 18.04 LTS
- CMake 3.10.2
什么是 CMake?
CMake 是一个构建工程的工具
如何安装 CMake?
sudo apt install cmake
如何使用 CMake?
- 在指定目录下写 CMakeLists.txt,文件名区分大小写
- 内部编译会导致文件结构混乱,因此推荐外部构建
$ # 创建构建目录 $ mkdir -p build $ cd build $ $ # 设置安装前缀 $ cmake -DCMAKE_INSTALL_PREFIX=/usr .. $ $ # 生成 MakeFile $ 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) cmmand() endif(val) ## 判断变量是否未定义 if(not val) cmmand() endif(not val)