cmake快速入门

【CMake】CMake从入门到实战系列(二)——实例入手,讲解CMake的基本流程 在 linux 平台下使用 CMake 的基本流程如下:1、编写 CMake 配置文件 CMakeLists.txt。2、执行命令 cmake PATH。其中,PATH 是 CMakeLists.txt所在的目录。3、使用 make 命令进行编译。针对上面的流程,初步接触CMake的读者可能还是不太清楚明了,那么接下来,我们通过实例开始总结CMake的基本流程。 阅读详情


参考资料:

准备

如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile
CMake就是针对上面问题所设计的工具:它首先允许开发者编写一种平台无关的CMakeLists.txt来定制整个编程流程,然后再根据目标用户的平台进一步生成所需的本地化Makefile和工程文件。
例如:Unix的Makefile或Windows的Visual Studio工程。
从而做到“Write once, run everywhere”。

本文以Windows为例

下载地址:https://cmake.org/download/

然后将CMake添加到环境变量中(默认路径:C:Program Files\CMake\bin)

CMake的所有操作都是在CMakeLists.txt里面完成的,所以主要就是完成CMakeLists.txt文件了

本文的代码在这里

单个源文件

创建文件

假设现在我们的项目中只有一个源文件 main.cpp

main.cpp的内容如下:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector<string> msg {"Hello", "CMake"};

    for (const string& word : msg)
    {
        cout << word << " ";
    }
    cout << endl;
}

创建CMakeLists.txt

创建CMakeLists.txt,并保存在与main.cpp的同级目录下,内容如下:

# CMake 最低版本要求
cmake_minimum_required(VERSION 3.2)

# 项目信息
project(Demo_1)

# 指定生成目标
add_executable(Demo_1 main.cpp)

CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的。符号 # 后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。

对于上面的 CMakeLists.txt 文件,依次出现了几个命令:

  • cmake_minimum_required:指定运行此配置文件所需的 CMake 的最低版本;
  • project:参数值是 Demo1,该命令表示项目的名称是 Demo1 。
  • add_executable: 将名为 main.cpp 的源文件编译成一个名称为 Demo 的可执行文件。

编译

在当前目录下打开windows的命令行工具,键入:

cmake -S . -B build
参数含义
-S指定源文件根目录,必须包含一个CMakeLists.txt文件
-B指定构建目录,构建生成的中间文件和目标文件的生成路径
-D指定变量,格式为-D =,-D后面的空格可以省略

比如,指明使用当前目录作为源文件目录,其中包含CMakeLists.txt文件;使用build目录作为构建目录;设定变量CMAKE_BUILD_TYPE的值为Debug,变量AUTHOR的值为RealCoolEngineer:

cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DAUTHOR=RealCoolEngineer

多个源文件

创建文件

./Demo_2
    |
    +--- main.cpp
    |
    +--- hello.cpp
    |
    +--- hello.h

hello.h代码如下:

#pragma once

void test(const std::vector<std::string>& str);

hello.cpp代码如下:

#include <iostream>
#include <vector>
#include <string>
#include "hello.h"

using namespace std;

void test(const vector<string>& msg){
    for (const string& word : msg)
    {
        cout << word << " ";
    }
    cout << endl;
    return;
}

main.cpp代码如下:

#include <iostream>
#include <vector>
#include <string>
#include "hello.h"

using namespace std;

void test(const vector<string>& msg){
    for (const string& word : msg)
    {
        cout << word << " ";
    }
    cout << endl;
    return;
}

创建CMakeLists

# CMake 最低版本号要求
cmake_minimum_required (VERSION 3.2)

# 项目信息
project (Demo_2)

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

# 指定生成目标
add_executable(Demo_2 ${DIR_SRCS})

使用 aux_source_directory 命令,该命令会查找指定目录下的所有源文件,然后将结果存进指定变量名。其语法如下:

这样,CMake 会将当前目录所有源文件的文件名赋值给变量 DIR_SRCS ,再指示变量 DIR_SRCS 中的源文件需要编译成一个名称为 Demo_2 的可执行文件。

aux_source_directory(<dir> <variable>)

编译

在当前目录下打开windows的命令行工具,键入:

cmake -S . -B build

多个目录,多个源文件

创建文件

./Demo_3
    |
    +--- main.cpp
    |
    +--- algorithm/
          |
          +--- hello.cpp
          |
          +--- hello.h

创建CMakeLists

对于这种情况,需要分别在项目根目录 Demo_3 和 algorithm 目录里各编写一个 CMakeLists.txt 文件。

为了方便,我们可以先将 algorithm 目录里的文件编译成静态库,由 main 函数调用。

(编译时,只需在根目录下执行一次cmake即可)

根目录中的 CMakeLists.txt :

# CMake 最低版本号要求
cmake_minimum_required (VERSION 3.2)

# 项目信息
project (Demo_3)

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

# 添加 math 子目录
add_subdirectory(algorithm)

# 指定生成目标 
add_executable(Demo_3 main.cpp)

# 添加链接库
target_link_libraries(Demo_3 Hello)

使用命令 add_subdirectory 指明本项目包含一个子目录 algorithm,这样 algorithm 目录下的 CMakeLists.txt 文件和源代码也会被处理。

使用命令 target_link_libraries 指明可执行文件 main 需要连接一个名为 Hello 的链接库 。

子目录下的 CMakeLists.txt :

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)

# 生成链接库
add_library (Hello ${DIR_LIB_SRCS})

使用命令 add_library 将目录中的源文件编译为静态链接库。

编译

在当前目录下打开windows的命令行工具,键入:

cmake -S . -B build

在 CMake 生成的 Visual Studio 工程中保持源码文件的目录组织

source_group介绍

在某一工程内,多个文件散乱的分布在 Source Files/ 目录和 Header Files 目录中, 不便于查看和调试代码,

通过使用 source_group 命令, 可以使源码保持原本的目录组织方式 (当然也可以自己重新组织).

先看看官方给出的命令说明: source_group() 用于定义生成 IDE 工程时的源码分组 (source groups). 有两种创建方式:

  • source_group( [FILES …] [REGULAR_EXPRESSION ])
  • source_group(TREE [PREFIX ] [FILES …])

于定义工程中的源码属于哪个目录组, 主要用于 Visual Studio 中. 有以下选项:

  • TREE CMake 会自动检测 文件路径来确定需要创建的 source groups, 使得工程中的目录结构和实际文件在磁盘上的目录结构一致. 根据 指定的根路径将 中的路径截断为相对路径;
  • PREFIX 在 路径中的 Source group 和文件会被放在 group 中;
  • FILES 将显式指定的所有源文件都放在 group 中, 如果是相对路径, 则是以当前源码路径为参考;
  • REGULAR_EXPRESSION 可以匹配到正则表达式的源码文件会被放在 group 中. 如果某个源码文件可以和多个组进行匹配, 则该文件会被归到最后一个组; 如果某个源码文件没有和任一个组匹配上, 则该文件会被归到正则表达式的最后一个组.

创建文件

./Demo_4
    |
    +--- src/
    |     |
    |     +--- main.cpp
    |
    +--- algorithm/
          |
          +--- hello.cpp
          |
          +--- hello.h

创建CMakeLists.txt

分别在项目根目录 Demo_4 和 algorithm 目录里各编写一个 CMakeLists.txt 文件。

algorithm的CMakeLists.txt文件与前一节的相同,均是将目录中的源文件编译为静态链接库。

根目录中的 CMakeLists.txt :

# CMake 最低版本号要求
cmake_minimum_required (VERSION 3.2)

# 项目信息
project (Demo_4)

# 添加 algorithm 子目录
add_subdirectory(algorithm)

#main
set(PROJECT_MAIN_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src")
file(GLOB project_main_source_files ${PROJECT_MAIN_DIR}/*.cpp)
source_group("Source Files" FILES ${project_main_source_files})

#algorithm
set(PROJECT_ALGORITHM_DIR "${PROJECT_MAIN_DIR}/algorithm")
file(GLOB project_algorithm_header_files ${PROJECT_ALGORITHM_DIR}/*.h)
file(GLOB project_algorithm_source_files ${PROJECT_ALGORITHM_DIR}/*.cpp)
source_group("Header Files\\algorithm" FILES ${project_algorithm_header_files})
source_group("Source Files\\algorithm" FILES ${project_algorithm_source_files})


#将上述文件夹include到工程里面
include_directories(${PROJECT_MAIN_DIR} ${PROJECT_ALGORITHM_DIR})


# 指定生成目标
add_executable(${PROJECT_NAME} ${project_main_source_files} ${project_algorithm_header_files} ${project_algorithm_source_files})

# 添加链接库
target_link_libraries(${PROJECT_NAME} Hello)

编译

在当前目录下打开windows的命令行工具,键入:

cmake -S . -B build

结果截图如下:

result

数据库融合与Python异步编程实战:多模、AI与高并发指南 数据处理技术正经历从垂直分工到融合收敛的演进。传统架构中OLTP、OLAP、缓存、搜索各自独立,数据分散且同步复杂,而多模数据库和HTAP等融合路径正在将关系、文档、向量等能力集成到统一内核,从底层降低工程成本。与此同时,AI基础设施的竞争不再只看算力,存储、数据库与网络构成三角博弈,存算分离和向量检索内嵌成为关键趋势。在应用开发侧,Python异步编程是提升数据读写效率的重要工程手段,通过asyncio配合异步驱动和连接池,可将高并发IO等待时间重叠,显著优化吞吐。面对数据库选型、迁移、死锁排查与连接池调 阅读详情

相关推荐

CMake入门教程【高级篇】源文件分组(source_group)

CMake源文件分組source_group

小鱼酱的博客 1918

[解决]是否已安装该可执行文件或设置是否包含正确的路径(cmake.cmakePath)?

vscode是否已安装该可执行文件或设置是否包含正确的路径(cmake.cmakePath)? 仅仅在vscode 中安装了cmake,cmake-tool是不能用的。 先cmd看下,cmake -version有没有安装cmake 如果没有就安装下,下载连接https://cmake.org/download/ windows选这个,直接安装 选所有用户 cmd,看下cmake -version ...

darcsdn 2万+

Hypermesh二次开发实战:Tcl命令分类与常用函数详解(附避坑指南)

本文深入解析Hypermesh二次开发中Tcl命令的三大核心类别:界面命令、查询命令与修改命令。重点剖析了*createmark集合管理与hm_getvalue信息查询等关键函数的实战用法,并提供了避免Mark覆盖、生命周期管理等常见陷阱的实用指南,旨在帮助CAE工程师构建高效可靠的自动化前处理流程。

weixin_29233333的博客 241

Bad CMake executable . Is it installed or settings contain the correct path (cmake.cmakePath)

安装Cmake时候的问题

Kun的博客 1万+

告别裸机:在FreeRTOS上为STM32移植SOEM 1.4.0的完整指南

本文详细介绍了在FreeRTOS环境下为STM32H7系列芯片移植SOEM 1.4.0的完整指南,涵盖环境准备、任务架构设计、OSAL层适配及网络驱动优化等关键步骤。通过EtherCAT主站解决方案的实现,帮助开发者构建稳定可靠的工业自动化系统,提升实时通信性能。

weixin_33582311的博客 363

别再只调电压了!深入理解数控电源的CC/CV模式与双闭环PID控制(以BUCK电路为例)

本文深入解析数控电源的CC/CV模式与双闭环PID控制技术,以BUCK电路为例,探讨如何通过双闭环控制优化负载突变响应和模式切换稳定性。文章详细介绍了电压环与电流环的协同工作原理、PID参数整定技巧及工程实践中的非线性补偿方法,帮助工程师提升电源设计的智能控制能力。

weixin_27017211的博客 265

[cmake]cmake命令之cmake_path

该命令用来操作路径,仅仅是语义概念上的处理,并不会在文件系统上执行任何交互。路径可以不存在,甚至是当前系统不允许的路径。如果想要了解与文件系统交互的命令,参考file()。cmake_path会将路径以CMake所运行的构建系统(例如,主机平台)的格式处理,而不是目标系统。在交叉编译过程中,如果路径包含的元素在CMake运行的系统上无法表示(例如路径是C:\\,但是系统并不是Windows),那么结果不可预测。cmake_path分为以下几个子命令:分解、查询、修改、生成、转换、哈希。

FL1768317420的博客 7774

STM32F103C8T6驱动DM542步进电机:从CubeMX配置到按键控制的全流程避坑指南

本文详细介绍了如何使用STM32F103C8T6通过CubeMX配置驱动DM542步进电机的全流程,包括PWM频率计算、GPIO模式选择及按键控制实现。重点解决了常见硬件连接错误、PWM参数配置及加减速算法优化,帮助开发者快速搭建稳定的电机控制系统。

weixin_42741930的博客 308

CMake快速入门

CMake官方的渐进式教程从官方角度多的尽量介绍了官方提供的功能,不过对于入门来说稍稍生硬,对于入门使用来说可以有更快入门的方式的。这篇文章将介绍写更加简单的入门使用的方式。

Naisu的各种笔记 1060

Plant Simulation 实战指南:从二次分配问题到优化布局设计

本文是一份Plant Simulation实战指南,详细讲解了如何利用该仿真软件解决工厂布局中的二次分配问题。通过从数据准备、模型搭建到集成遗传算法进行自动化优化的完整流程,帮助工程师在数字孪生环境中高效寻找最优设备布局方案,从而显著降低物流成本,提升生产效率。

i1j2k的博客 565

【光子 AI 】LangGraph:Graph = 有向有环图 + 状态机实现原理详解:数据结构模型与核心算法代码实现逻辑解析

LangGraph核心原理解析:基于Pregel模型的消息传递图,结合有向有环图和状态机特性。关键实现包括:1) 共享状态机制(TypedDict/Pydantic模型)配合Reducer逻辑实现状态更新;2) 图拓扑结构通过邻接表维护节点和条件边;3) 检查点机制支持状态持久化和恢复。运行时采用Pregel循环算法,通过超级步迭代执行节点函数、应用状态归约、条件路由下一批节点,同时支持人工中断和异步并行处理。该架构使LangGraph具备循环执行、条件跳转等DAG无法实现的动态流程控制能力。

AI天才研究院 1036

CMake快速入门教程[资料备份]

适合小白入门学习CMake快速入门教程

weixin_42201083的博客 299

C#与大数据分析:如何通过上位机进行设备故障诊断与预测

设备故障诊断是通过对设备的运行状态数据进行分析,识别和确认故障的类型和位置。而设备故障预测则是通过对设备的历史数据和运行状态进行分析,预测设备何时可能出现故障,从而进行预防性维护。数据采集:通过各种传感器、PLC、嵌入式设备等采集设备运行数据,如温度、压力、振动、转速、功率等。数据预处理:对采集到的数据进行清洗、去噪、缺失值处理、标准化等操作,以确保数据质量。特征工程:从原始数据中提取出有助于故障诊断和预测的特征,例如统计特征、时域特征、频域特征等。数据分析与建模。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1061

GLFW+CMake 快速入门指南

GLFW+CMake 快速入门指南 项目介绍 该项目名为 GLFW-CMake-starter,由 juliettef 提供,旨在帮助开发者轻松地使用 CMake 构建包含 GLFW 的多平台应用程序。GLFW 是一个用于创建图形界面的应用程序框架,支持OpenGL、Vulkan等API,适用于Windows、Linux和MacOS操作系统。此starter项目简化了配置过程,特别适合CMake...

gitblog_01054的博客 620

使用SSC添加大量的SDO条目

使用SSC添加大量的SDO条目 SSC用表格添加SDO,PDO部分必须指定到0x1600和0x1A00分配TxPdo和RxPdo映射,在0x1C12和0x1C13分别分配到SM2和SM3。在0x6000和0x7000未指定的entry就是SDO部分。

PI_sunyang的博客 3167

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

(CMake):CMake安装及快速入门案例

目录 下载CMake并安装 打开VSCode安装插件 CMake快速入门案例 下载CMake并安装 官网地址:https://cmake.org/download/ 打开VSCode安装插件 CMake快速入门案例 打开命令面板,找到Cmake: 快速入门 点击生成,在build下生成可执行文件 【注】参考:https://www.bilibili.com/video/BV1zt4y1C7T9?p=2 ...

baidu_41388533的博客 1176

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Cmake快速入门

cmake编译 一般选择第二种 在当前工程目录下 mkdir build cd build cmake .. make 一、 # 单个目录实现 # CMake 最低版本号要求 cmake_minimum_required (VERSION 2.8) # 工程,他不是执行文件名 PROJECT(0VOICE) # 手动加入文件 ${变量名}} ,比如${SRC_LIST} SET(SRC_LIST main.c) SET(SRC_LIST2 main2.c) # MESSAGE和echo类似 MESS

菊头蝙蝠的博客 1017

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

CMake语法快速入门

1.Cmake语法详解 什么是Cmake 在Android Studio 2.2及以上,构建原生库的默认工具是CMake CMake是一个跨平台的构建工具,可以用简单的语句来描述所有平台的安装(编译过程)。能够输出各种各样的makefile或者project文件。CMake并不直接构建最终的软件,而是生成其他的工具的脚本,比如生成makefile,然后在依据这个工具的构建方式使用。 CMake是...

风炫灬梦想的博客 538

CMake 快速入门

CMake 是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile 或者 project 文件,CMake 的配置文件取名为 CMakeLists.txt。也就是在 CMakeLists.txt 这个文件中写 cmake 代码。 一句话:cmake 就是将多个 cpp、hpp 文件组合构建为一个大工程的语言。......

凌桓丶的博客 1420

CMAKE快速入门及实例

摘要:本文介绍了CMake跨平台构建系统的基础知识和实用示例。内容包括CMake特点、安装方法、基础语法(变量设置、条件判断、循环等),以及5个典型实战案例:单文件项目、多文件项目、静态库构建、外部库集成和条件编译。每个示例提供完整的项目结构和CMakeLists.txt配置,帮助开发者快速掌握CMake的核心功能和应用场景。

小宝哥Code的专栏 598

学习cmake快速入门笔记

学习cmake快速入门笔记 转载链接:https://blog.csdn.net/kai_zone/article/details/82656964 本博文的大概框架: 1, cmake 的介绍,下载,安装和使用 2, cmake 的手册详解,我关注了 -C和-G 的使用 3, 在Linux中构建cmake 的工程 第一个问题: cmake 介绍,下载和安装以及使用:https://fukun.o...

weijie1984222的博客 346
上一篇: [转载]验证二叉搜索树
下一篇: 写一个矩阵
Ryzen3
博客等级 码龄8年 218粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值