Cmake入门及CMakeLists.txt 语法介绍

发布于:2025-06-23 ⋅ 阅读:(13) ⋅ 点赞:(0)

一、Cmake 简介

cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。

本文供C++软件开发者入门学习参考,主要内容来自网络。

下载地址:

Download CMake

windows下,可以下载Windows x64 ZIP

当前最新版 4.0.3。

配置 CMake

确保 CMake 的安装路径被添加到系统的 PATH 环境变量中,这样可以在任何位置的命令行中访问 CMake。

Windows 环境变量设置

如果在安装过程中选择了将 CMake 添加到 PATH,则不需要额外配置。

如果未选择,可以手动添加:右键点击"计算机"或"此电脑",选择"属性" -> "高级系统设置" -> "环境变量",在"系统变量"中找到 Path,点击"编辑",将 CMake 的安装路径添加进去。

macOS 和 Linux

通常安装程序会自动配置 PATH,如果没有,可以手动配置。

CMake GUI 使用

CMake 也提供了图形用户界面(GUI),可以用于更直观地配置项目。

在 Windows 中,启动  cmake-gui.exe

二、CMake 基础

CMakeLists.txt 文件

CMakeLists.txt 是 CMake 的配置文件,用于定义项目的构建规则、依赖关系、编译选项等。

每个 CMake 项目通常都有一个或多个 CMakeLists.txt 文件。

简单示例如下:

#最低支持的CMAKE版本
cmake_minimum_required(VERSION 3.31.0)

set(CMAKE_C_COMPILER "C:/Qt/Tools/mingw1310_64/bin/gcc.exe")
set(CMAKE_CXX_COMPILER "C:/Qt/Tools/mingw1310_64/bin/g++.exe")

set(projectName hello)

#项目名字
project(${projectName})

#设置C++标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

#自动检查系统中可用的C++编辑器, 我已经在系统中安装了MSVC

#将该目录下所有的源文件都关联起来
aux_source_directory(Demo.cpp CPP_LIST)

#生成一个名叫MyProject.exe的可执行文件
add_executable(${projectName} ${CPP_LIST})

文件结构和基本语法

CMakeLists.txt 文件使用一系列的 CMake 指令来描述构建过程。常见的指令包括:

1、指定 CMake 的最低版本要求:

cmake_minimum_required(VERSION <version>)

例如:

cmake_minimum_required(VERSION 3.10)

2、定义项目的名称和使用的编程语言:

project(<project_name> [<language>...])

例如:

project(MyProject CXX)

3、指定要生成的可执行文件和其源文件:

add_executable(<target> <source_files>...)

例如:

add_executable(MyExecutable main.cpp other_file.cpp)

4、创建一个库(静态库或动态库)及其源文件:

add_library(<target> <source_files>...)

例如:

add_library(MyLibrary STATIC library.cpp)

5、链接目标文件与其他库:

target_link_libraries(<target> <libraries>...)

例如:

target_link_libraries(MyExecutable MyLibrary)

6、添加头文件搜索路径:

include_directories(<dirs>...)

例如:

include_directories(${PROJECT_SOURCE_DIR}/include)

7、设置变量的值:

set(<variable> <value>...)

例如:

set(CMAKE_CXX_STANDARD 11)

8、设置目标属性:

target_include_directories(TARGET target_name
                          [BEFORE | AFTER]
                          [SYSTEM] [PUBLIC | PRIVATE | INTERFACE]
                          [items1...])

例如:

target_include_directories(MyExecutable PRIVATE ${PROJECT_SOURCE_DIR}/include)

9、安装规则:

install(TARGETS target1 [target2 ...]
        [RUNTIME DESTINATION dir]
        [LIBRARY DESTINATION dir]
        [ARCHIVE DESTINATION dir]
        [INCLUDES DESTINATION [dir ...]]
        [PRIVATE_HEADER DESTINATION dir]
        [PUBLIC_HEADER DESTINATION dir])

例如:

install(TARGETS MyExecutable RUNTIME DESTINATION bin)

10、条件语句 (if, elseif, else, endif 命令)

if(expression)
  # Commands
elseif(expression)
  # Commands
else()
  # Commands
endif()

例如:

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  message("Debug build")
endif()

11、自定义命令 (add_custom_command 命令):

add_custom_command(
   TARGET target
   PRE_BUILD | PRE_LINK | POST_BUILD
   COMMAND command1 [ARGS] [WORKING_DIRECTORY dir]
   [COMMAND command2 [ARGS]]
   [DEPENDS [depend1 [depend2 ...]]]
   [COMMENT comment]
   [VERBATIM]
)

例如:

add_custom_command(
   TARGET MyExecutable POST_BUILD
   COMMAND ${CMAKE_COMMAND} -E echo "Build completed."
)

变量和缓存

CMake 使用变量来存储和传递信息,这些变量可以在 CMakeLists.txt 文件中定义和使用。

变量可以分为普通变量和缓存变量。

变量定义与使用

定义变量:

set(MY_VAR "Hello World")

使用变量:

message(STATUS "Variable MY_VAR is ${MY_VAR}")

缓存变量

缓存变量存储在 CMake 的缓存文件中,用户可以在 CMake 配置时修改这些值。缓存变量通常用于用户输入的设置,例如编译选项和路径。

定义缓存变量:

set(MY_CACHE_VAR "DefaultValue" CACHE STRING "A cache variable")

使用缓存变量:

message(STATUS "Cache variable MY_CACHE_VAR is ${MY_CACHE_VAR}")

查找库和包

CMake 可以通过 find_package() 指令自动检测和配置外部库和包。

常用于查找系统安装的库或第三方库。

find_package() 指令

基本用法:

find_package(Boost REQUIRED)

指定版本:

find_package(Boost 1.70 REQUIRED)

查找库并指定路径:

find_package(OpenCV REQUIRED PATHS /path/to/opencv)

使用查找到的库:

target_link_libraries(MyExecutable Boost::Boost)

设置包含目录和链接目录:

include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})

使用第三方库

假设你想在项目中使用 Boost 库,CMakeLists.txt 文件可能如下所示:

实例

cmake_minimum_required(VERSION 3.10)
project(MyProject CXX)

# 查找 Boost 库
find_package(Boost REQUIRED)

# 添加源文件
add_executable(MyExecutable main.cpp)

# 链接 Boost 库
target_link_libraries(MyExecutable Boost::Boost)

include_directories() 和 target_include_directories()

在 CMake 中,include_directories() 和 target_include_directories() 都用于指定头文件的搜索路径,但它们的作用范围和使用方式有显著区别。

相同点:

  • 两者都用于添加头文件的搜索路径,编译器会在这些路径中查找 #include 指令中指定的头文件。
  • 两者都支持绝对路径和相对路径,相对路径是相对于当前 CMakeLists.txt 文件所在的目录。
  • 两者都可以用于指定公共头文件路径(PUBLIC)、私有头文件路径(PRIVATE)或接口头文件路径(INTERFACE)。

区别:

特性 include_directories() target_include_directories()
作用范围 全局作用域,影响所有目标(target)。 仅作用于指定的目标(target)。
推荐使用场景 适用于简单的项目或旧版 CMake 项目。 适用于现代 CMake 项目,推荐优先使用。
目标关联性 不直接关联到特定目标,可能影响所有目标。 显式关联到特定目标,避免污染其他目标。
可维护性 较差,容易导致全局路径污染。 较好,路径与目标绑定,逻辑清晰。
作用域控制 无法精确控制路径的作用范围。 可以通过 PUBLICPRIVATEINTERFACE 精确控制路径的作用范围。
现代 CMake 推荐 不推荐使用,除非有特殊需求。 推荐使用,符合现代 CMake 的最佳实践。

三、CMake 构建流程

CMake 的构建流程分为几个主要步骤,从设置项目到生成和执行构建命令。

  1. 创建构建目录:保持源代码目录整洁。
  2. 使用 CMake 生成构建文件:配置项目并生成适合平台的构建文件。
  3. 编译和构建:使用生成的构建文件执行编译和构建。
  4. 清理构建文件:删除中间文件和目标文件。
  5. 重新配置和构建:处理项目设置的更改。

四、参考资料

CMake 基础 | 菜鸟教程

CMakeLists.txt 语法介绍与实例演练_android cmakelists.txt可以写多个吗-CSDN博客


网站公告

今日签到

点亮在社区的每一天
去签到