注意:这是一篇cmake入门浅显的文章,深入学习的话没必要阅读。
CMake的使用流程及其语法非常丰富(其实就是过于灵活,一个项目一个风格,看上去相当麻烦),下面逐步介绍一些核心概念和常用命令(语法太多,只写一点皮毛),并结合示例代码解释其功能:
CMake的使用流程主要分为以下几个步骤:
使用流程
-
安装CMake
- 在Linux系统中,可以通过包管理器(如apt、yum)安装。
- 在macOS中,可以通过Homebrew安装。
- 在Windows系统中,可以从CMake官方网站下载安装包或者二进制分发版安装。
-
创建CMakeLists.txt
在项目的根目录下创建一个名为CMakeLists.txt
的文本文件,它是CMake的核心配置文件。 -
编写CMakeLists.txt
文件中定义了一系列指令来描述如何构建项目,包括但不限于源文件列表、库依赖、编译选项等。 -
初始化构建目录
在项目根目录下创建一个专门用来存放构建输出的目录(例如:build
)。 -
运行CMake
在构建目录中运行CMake,指定源码目录和相关的构建选项。例如:mkdir build cd build cmake ..
可以附加额外的参数来选择生成器类型(如
-G "Visual Studio 15 2017"
)或者设置变量(如-DCMAKE_BUILD_TYPE=Debug
)。 -
构建项目
使用CMake生成的构建系统进行构建:cmake --build . # 或在Windows上针对Visual Studio使用 cmake --build . --config Debug
CMakeLists.txt语法示例
以下是一个简化的CMakeLists.txt文件示例:
# 指定CMake最小版本
cmake_minimum_required(VERSION 3.10)# 定义项目名称和语言
project(MyProject CXX)# 添加源文件,这里假设有两个源文件
aux_source_directory(. SRC_LIST) # 这一行用于自动收集目录下所有源文件(现代CMake推荐显式列出源文件)
# 或者明确指定源文件
set(SRC_LIST main.cpp mylib.cpp)# 创建一个可执行文件目标
add_executable(MyApp ${SRC_LIST})# 添加链接库(假设有一个名为mylib的静态库)
add_library(mylib STATIC src/mylib.cpp)
target_include_directories(mylib PUBLIC include) # 添加公共头文件路径
target_link_libraries(MyApp mylib) # 将mylib链接到可执行文件# 设置C++标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)# 查找并链接第三方库(如OpenCV)
find_package(OpenCV REQUIRED)
if(OpenCV_FOUND)include_directories(${OpenCV_INCLUDE_DIRS})target_link_libraries(MyApp ${OpenCV_LIBRARIES})
endif()# 设置安装规则(如果需要)
install(TARGETS MyApp DESTINATION bin)
install(DIRECTORY include/ DESTINATION include)
cmake_minimum_required
确保CMake版本兼容性。project
定义项目名和使用的编程语言。aux_source_directory
或直接add_executable
后的列表用于指定项目源文件。add_executable
创建可执行文件的目标。add_library
定义库文件目标。target_include_directories
设定目标的头文件搜索路径。target_link_libraries
链接所需的库到目标。set(CMAKE_CXX_STANDARD)
设置C++语言标准级别。find_package
用于查找并引入第三方库,如果找到则设置其头文件目录和链接库。install
用于定义安装规则,指定哪些目标和文件应在安装时复制到相应的位置。
注意,现代CMake实践鼓励使用target_*
系列命令而非全局的include_directories
和link_directories
命令,以便更好地维护构建的透明性和模块化。