当前位置: 首页 > news >正文

Cmake入门及CMakeLists.txt 语法介绍

一、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 targetPRE_BUILD | PRE_LINK | POST_BUILDCOMMAND command1 [ARGS] [WORKING_DIRECTORY dir][COMMAND command2 [ARGS]][DEPENDS [depend1 [depend2 ...]]][COMMENT comment][VERBATIM]
)

例如:

add_custom_command(TARGET MyExecutable POST_BUILDCOMMAND ${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博客

相关文章:

  • 数据库从零开始:MySQL 中的 DDL 库操作详解【Linux版】
  • 服务网格安全(Istio)从入门到实践
  • 电子电气架构 --- 软件供应商如何进入OEM体系
  • 频繁操作Json嵌套数据PostgreSQL配合JSON操作工具类+sql
  • 最小化联邦平均(FedAvg)的算法开销
  • Apipost 签约锐捷网络:AI赋能,共推 ICT 领域 API 生态智能化升级
  • 算法第38天|322.零钱兑换\139. 单词拆分
  • FTTR+软路由网络拓扑方案
  • LVS vs Nginx 负载均衡对比:全面解析
  • 【分布式】基于Dubbo实现对远程调用接口的封装
  • 数据结构第八章(六)-置换选择排序和最佳归并树
  • 企业实践 | 银河麒麟KylinOS-V10(SP3)高级服务器操作系统基础安装指南
  • cusor资源管理器缩进调整与工具条竖着摆放
  • 电子制造智能化转型:MES如何解决工艺复杂、质量追溯与供应链协同
  • 如何使用postman做接口自动化测试?
  • 魅族“换血”出牌:手机基本盘站不稳,想靠AI和汽车“改命”
  • 使用 C++/OpenCV 构建中文 OCR 系统:实现账单、发票及 PDF 读取
  • OCR大模型,破解金融文档处理困境,从文字识别到文字理解
  • 《Go语言圣经》闭包
  • .Net Framework 4/C# 数据访问技术(ADO.NET)
  • 大连做网站绍兴厂商/seo优化工具哪个好
  • 方维制网站/最好看免费观看高清大全
  • 做一个网站flash收多少钱/在百度上怎么发布广告
  • 高端网站建设公司有哪些项目/国内免费域名注册
  • php网站建设学习/百度搜索引擎排名
  • wordpress单页导航/网站优化公司认准乐云seo