CMake 是一个非常强大的工具,用于构建和管理复杂的软件项目。下面是对 CMake 使用的更详细的总结,包括更多高级特性以及一些最佳实践。
基础概念
- CMakeLists.txt: 这是 CMake 的配置文件,用于描述项目的构建逻辑。
- CMake 最小版本:
cmake_minimum_required
指令用于设置项目所需的 CMake 最低版本。 - 项目:
project
指令定义项目名称和其他属性,如版本号和语言。 - 源文件: 包含
.cpp
和.h
等源代码文件。 - 可执行文件: 由
add_executable
创建的目标文件。 - 库文件: 由
add_library
创建的静态库或共享库。 - 目标: 构建系统中的可执行文件或库。
- 编译指令:
target_compile_features
,target_compile_options
,target_include_directories
等用于控制编译行为。 - 链接指令:
target_link_libraries
用于链接库到目标。 - 安装指令:
install
用于安装构建好的文件到系统中。 - 查找外部库:
find_package
和find_library
用于查找外部库和其位置。
常用命令详解
项目定义
cmake_minimum_required(VERSION 3.10)
project(MyProject VERSION 1.0 LANGUAGES CXX)
cmake_minimum_required
: 指定项目所需的 CMake 最低版本。project
: 定义项目的基本信息。
添加源文件
add_executable(myapp main.cpp util.cpp)
add_library(mylib STATIC src1.cpp src2.cpp)
add_executable
: 创建可执行文件。add_library
: 创建静态库或共享库。
链接库
target_link_libraries(myapp PRIVATE mylib)
target_link_libraries
: 将库链接到目标。
查找外部库
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(myapp ${OpenCV_LIBS})
find_package
: 查找并配置外部库。include_directories
: 添加头文件搜索路径。target_link_libraries
: 链接外部库。
安装目标
install(TARGETS myapp DESTINATION bin)
install(DIRECTORY include/ DESTINATION include)
install
: 安装编译后的文件到指定目录。
配置文件生成
configure_file(config.h.in config.h @ONLY)
configure_file
: 用于生成配置文件。
自定义规则
add_custom_command(OUTPUT out.txtCOMMAND cat file1.txt file2.txt > out.txtDEPENDS file1.txt file2.txt
)
add_custom_target(custom OUT SOURCES out.txt)
add_custom_command
: 定义自定义命令。add_custom_target
: 定义自定义目标。
条件判断
if(APPLE)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
endif()
if
: 条件判断。
循环
foreach(dir ${CMAKE_SOURCE_DIR}/src)add_subdirectory(${dir})
endforeach()
foreach
: 循环。
变量和缓存
set(SOURCE_FILES main.cpp util.cpp)
option(BUILD_TESTS "Build tests" OFF)
set
: 定义变量。option
: 定义命令行选项。
高级特性
多配置构建
if(NOT CMAKE_BUILD_TYPE)set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
endif()
CMAKE_BUILD_TYPE
: 控制构建类型。
版本控制
- 将 CMakeLists.txt 文件加入版本控制系统,如 Git。
文档
- 为重要的 CMakeLists.txt 文件添加注释,说明其用途和配置。
测试
enable_testing()
add_executable(tests tests.cpp)
target_link_libraries(tests PRIVATE mylib)
add_test(NAME basic_test COMMAND tests)
enable_testing
: 启用测试。add_test
: 添加测试目标。
包装项目
install(TARGETS myapp EXPORT MyAppTargets)
install(EXPORT MyAppTargets DESTINATION lib/cmake/MyApp)
install(EXPORT)
: 生成包配置文件。
示例
这里给出一个稍微复杂一些的例子,其中包含了项目定义、可执行文件、静态库、查找外部库、安装、测试和自定义规则:
cmake_minimum_required(VERSION 3.10)
project(MyApp VERSION 1.0 LANGUAGES CXX)# 添加可执行文件
add_executable(myapp main.cpp)# 添加静态库
add_library(mylib STATIC src1.cpp src2.cpp)# 链接库
target_link_libraries(myapp PRIVATE mylib)# 查找外部库
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(myapp ${OpenCV_LIBS})# 安装目标
install(TARGETS myapp DESTINATION bin)
install(DIRECTORY include/ DESTINATION include)# 自定义规则
add_custom_command(OUTPUT out.txtCOMMAND cat file1.txt file2.txt > out.txtDEPENDS file1.txt file2.txt
)
add_custom_target(custom OUT SOURCES out.txt)# 条件编译
if(APPLE)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
endif()# 循环添加子目录
foreach(dir ${CMAKE_SOURCE_DIR}/src)add_subdirectory(${dir})
endforeach()# 测试
enable_testing()
add_executable(tests tests.cpp)
target_link_libraries(tests PRIVATE mylib)
add_test(NAME basic_test COMMAND tests)# 包装项目
install(TARGETS myapp EXPORT MyAppTargets)
install(EXPORT MyAppTargets DESTINATION lib/cmake/MyApp)
以上内容提供了 CMake 的基本使用方法以及一些高级特性。