CMake学习

CMake是一个跨平台的自动化构建系统的程序,通过配置 CMakeLists.txt 文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本。自动生成不同平台的构建文件(makefile、Ninja等文件)

一、基本工作流程

1、编写CMakeLists.txt文件:定义项目的构建规则和依赖关系

2、生成构建文件:使用CMake生成适合当前平台的构建系统文件(如makefile)

3、执行构建:使用生成的构建系统文件(make、Ninja)来编译项目

image

 

二、基本语法

CMakeLists.txt由一系列CMake指令组合成,指令格式:命令名(参数列表)

1、指定CMake最低版本

# 语法:cmake_minimum_required(VERSION <version>)
# 该指令必须放在 CMakeLists.txt 的最顶部
# 示例:要求 CMake 版本不低于 3.10
cmake_minimum_required(VERSION 3.10)

 

2、定义项目名称和语言

# 语法:project(<项目名> [<语言>...])
# 语言参数可选,常用值:CXX(C++)、C(C 语言)
# 调用 project() 后会自动设置 PROJECT_NAME 等变量
project(TestProject CXX)

 

3、添加可执行文件

# 语法:add_executable(<目标名> <源文件>...)
# 将指定的源文件编译生成一个可执行文件
add_executable(MyApp main.cpp utils.cpp)

 

4、添加库文件

# 语法:add_library(<目标名> [STATIC | SHARED | MODULE] <源文件>...)
# STATIC:静态库(.a / .lib),编译时直接嵌入可执行文件
# SHARED:动态库(.so / .dll),运行时加载
# 不指定类型时,由 BUILD_SHARED_LIBS 变量决定
add_library(MyLib STATIC library.cpp)

 

5、链接库到目标

# 语法:target_link_libraries(<目标> <库>...)
# 将指定的库链接到目标(可执行文件或其他库)
# 可以链接自己项目中的库目标,也可以链接外部库
target_link_libraries(MyApp PRIVATE MyLib)

 

6、设置变量

# 语法:set(<变量名> <值>...)
# 定义一个普通变量,后续通过 ${变量名} 引用
set(CMAKE_CXX_STANDARD 17)

# 同时设置多个值(列表)
set(SOURCES main.cpp utils.cpp helper.cpp)
add_executable(MyApp ${SOURCES})

 

7、为目标指定头文件路径

# 语法:target_include_directories(<目标>
#           [BEFORE | AFTER]
#           [SYSTEM]
#           [PUBLIC | PRIVATE | INTERFACE]
#           <路径>...)
# PUBLIC:当前目标和依赖它的目标都能使用该路径
# PRIVATE:只有当前目标能使用
# INTERFACE:只有依赖当前目标的其他目标能使用
target_include_directories(MyApp PRIVATE ${PROJECT_SOURCE_DIR}/include)

 

8、设置安装规则

# 语法:install(TARGETS <目标>...
#         [RUNTIME DESTINATION <可执行文件安装路径>]
#         [LIBRARY DESTINATION <动态库安装路径>]
#         [ARCHIVE DESTINATION <静态库安装路径>]
#         [INCLUDES DESTINATION <头文件安装路径>])
# 定义执行 make install 时各类型文件的安装位置
install(TARGETS MyApp RUNTIME DESTINATION bin)

 

9、条件语句

# 语法:if(<条件>) ... elseif(<条件>) ... else() ... endif()
# CMake 支持的条件表达式包括:比较、逻辑运算、变量判断等
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    # Debug 模式下启用调试信息
    message(STATUS "当前为 Debug 构建模式")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
else()
    # Release 模式下启用优化
    message(STATUS "当前为 Release 构建模式")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
endif()

 

10、自定义指令

# 语法:add_custom_command(
#          TARGET <目标>
#          PRE_BUILD | PRE_LINK | POST_BUILD
#          COMMAND <命令> [参数...]
#          [COMMENT <说明>]
#          [VERBATIM])
# PRE_BUILD:在编译前执行
# PRE_LINK:在链接前执行
# POST_BUILD:在构建完成后执行
add_custom_command(
    TARGET MyApp POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E echo "构建完成!"
    COMMENT "打印构建完成信息"
)

 

三、实例

# 文件路径:项目根目录/CMakeLists.txt

# 1.指定 CMake 最低版本(必须放最前面)

cmake_minimum_required(VERSION 3.10)

 

# 2.定义项目名称 、版本和语言

project(MyProject VERSION 1.0.0 LANGUAES CXX)

 

# 3. 设置C++ 标准为 C++ 17, 并强制要求使用该标准

set(CMAKE_CXX_STANDARD 17)

set(CMAKE_CXX_STANDARD_REQUIRED ON)

 

# 4. 设置静态库目标

add_library(MyLib STATIC
    src/lib/core.cpp      # 核心功能实现
    src/lib/helper.cpp    # 辅助函数实现
)

 

# 5. 添加可执行文件目标
add_executable(MyApp
    src/main.cpp           # 程序入口
    src/utils.cpp          # 工具函数
)


# 6. 为库目标指定公开头文件路径
#    PUBLIC 表示使用 MyLib 的目标也能访问该路径
target_include_directories(MyLib PUBLIC ${PROJECT_SOURCE_DIR}/include)

 

# 7. 为可执行文件指定私有头文件路径
target_include_directories(MyApp PRIVATE ${PROJECT_SOURCE_DIR}/src)


# 8. 将 MyLib 链接到 MyApp
target_link_libraries(MyApp PRIVATE MyLib)

 

# 9. 设置安装规则
install(TARGETS MyApp RUNTIME DESTINATION bin)
install(TARGETS MyLib ARCHIVE DESTINATION lib)

 

四、 运行构建实例

#1.在项目路径下创建bulid文件夹,并切换到该路径

  mkdir bulid & cd bulid

#2. 生成构建文件

  cmake ..

#3. 编译项目

  cmake --bulid .

#4. 安装到系统目标

  cmake  --install .

CMake 构建流程

 

posted @ 2026-08-11 17:48  zbl1118  阅读(1)  评论(0)    收藏  举报