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

CMake简单入门

简介

CMake 是一个开源的跨平台构建系统生成工具,旨在简化和自动化项目的构建过程。它主要用于管理和控制软件构建的过程,特别是在处理复杂的项目结构和多个平台时。CMake 并不直接进行编译或链接,而是生成本地构建系统所需的文件(如 Makefile、Visual Studio 项目文件、Xcode 工程文件等),然后由这些工具进行实际的构建。

特点

  1. 跨平台支持: CMake 支持多种操作系统和编译器,包括 Windows、Linux、macOS、Android、iOS 等。它可以生成适应不同平台的构建文件,如 Makefile、Visual Studio、Xcode 工程文件等。
  2. 生成构建系统文件: CMake 通过读取 CMakeLists.txt 配置文件,生成适合目标平台的构建系统文件。这些文件可以是:
    • Makefile:用于 Linux 或类 Unix 系统上的构建。
    • Visual Studio 项目文件:用于 Windows 上的 Visual Studio 环境。
    • Xcode 工程文件:用于 macOS 上的 Xcode 工具链。
  3. 易于管理复杂项目: CMake 允许你将项目分解为多个子模块(subdirectories),每个子模块都可以有自己的 CMakeLists.txt 文件,从而使得管理大项目变得更加简单。例如,CMake 可以方便地处理项目中的静态库、动态库和可执行文件的构建。
  4. 支持外部依赖管理: CMake 通过 find_package() 来查找和配置项目所依赖的外部库和工具。例如,可以查找 Qt、OpenGL、Boost 等库,并自动配置其路径。
  5. 支持多种编译选项: CMake 允许设置编译器标志、优化级别、编译标准等,可以方便地支持 Debug 和 Release 模式的切换。
  6. 简化配置和构建: CMake 使得配置和构建流程简化为几条命令,避免了手动修改和维护平台特定的构建脚本。

基本概念

  1. CMakeLists.txt: CMake 项目中的核心文件是 CMakeLists.txt。它用于定义构建系统的规则,包括项目的源文件、依赖库、编译选项、构建目标等。一个 CMake 项目通常会有多个 CMakeLists.txt 文件,每个子目录都有一个 CMakeLists.txt 文件。

  2. 项目结构: CMake 项目的结构通常包含:

    • CMakeLists.txt:用于配置项目的根目录文件。
    • src/:源代码文件夹。
    • build/:用于存放构建过程中生成的文件。
    • include/:头文件目录。
    • lib/:库文件目录。

    示例结构:

    project/
    ├── CMakeLists.txt
    ├── src/
    │   ├── main.cpp
    │   └── other.cpp
    ├── include/
    │   └── header.h
    └── lib/└── library.a
    
  3. CMake 语法: CMake 使用一组简单的命令和语法,常见的命令包括:

    • cmake_minimum_required(VERSION 3.16):设置 CMake 的最低版本要求。
    • project(MyProject):定义项目的名称。
    • add_executable(MyExecutable main.cpp):定义一个可执行文件。
    • target_link_libraries(MyExecutable MyLibrary):链接库。
    • find_package(Qt5 REQUIRED):查找外部库(如 Qt)。
    • include_directories(path):指定头文件路径。
    • set(VAR value):定义变量。
    • add_subdirectory(path):处理子目录的 CMakeLists.txt 文件。

实际例子:

project/
├── CMakeLists.txt  # 根目录
├── card/
│   └── CMakeLists.txt  # card 子模块
└── player/└── CMakeLists.txt  # player 子模块

当前有一个包含多个模块(cardwindows 等)和依赖项(如 Qt)的项目,以下是从头到尾的构建流程:

  1. CMake 配置阶段
    • CMake 会扫描根目录的 CMakeLists.txt 文件,处理项目设置。
    • CMake 会依次处理每个子模块的 CMakeLists.txt 文件。
    • 例如,在 card 子目录下,CMake 会生成一个名为 card 的静态库,链接 Qt 核心库。
    • 根目录会通过 target_link_libraries() 连接各个模块,例如将 card 和其他模块(如 windows)链接到主程序 client
  2. 编译阶段
    • 运行 makecmake --build . 命令,编译器会将源文件编译成目标文件。
    • 每个 .cpp 文件都会生成一个 .o.obj 文件。
  3. 链接阶段
    • 链接器将目标文件和静态库/动态库链接成最终的可执行文件。
    • 如果 card 是静态库,链接器会将 card 库的代码和目标文件合并。
    • 如果依赖了动态库(如 Qt),链接器会将动态库的路径信息嵌入可执行文件。
  4. 生成可执行文件
    • 最终的 client 可执行文件会被生成。
  5. 安装阶段
    • 可执行文件和库文件(如果有的话)会被安装到指定的目录,准备部署和使用。

相关文章:

CMake简单入门

简介 CMake 是一个开源的跨平台构建系统生成工具,旨在简化和自动化项目的构建过程。它主要用于管理和控制软件构建的过程,特别是在处理复杂的项目结构和多个平台时。CMake 并不直接进行编译或链接,而是生成本地构建系统所需的文件&#xff0…...

树莓派 连接 PlutoSDR 教程

在树莓派5上安装PlutoSDR(ADALM-Pluto)的驱动程序,主要需要安装相关的库和工具,以便与PlutoSDR通信,比如libiio和libad9361,并确保系统能够识别设备。由于树莓派5运行的是基于Linux的系统(通常是…...

【时时三省】(C语言基础)用printf函数输出数据3

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 ( 5 ) e格式符。 用格式声明%e指定以指数形式输出实数。如果不指定输出数据所占的宽度和数字部分的小数位数,许多C编译系统(如VisualC)会自动给出数字部分…...

Git使用(二)--如何配置 GitHub 远程仓库及本地 Git 环境

在日常的开发过程中,使用版本控制工具 Git 是一个非常重要的技能,特别是对于管理和协作开发。通过 GitHub,我们可以轻松地进行代码版本管理和共享。这篇博客将带您一步步学习如何配置 Git 环境并将本地仓库与 GitHub 远程仓库连接起来。 一、…...

在Pycharm配置conda虚拟环境的Python解释器

〇、前言 今天在配置python解释器时遇到了这样的问题 经过一下午自行摸索、上网搜寻后,终于找到的解决的方案,遂将该方法简要的记录下来,以备后用,并希望能帮助到有同样问题或需求的朋友:) 我所使用的软件的版本如下,假…...

CURL一文通

文章目录 1.什么是curl2.curl可以发送什么请求3.常见curl发http相关请求怎么写4.curl带上的参数分别有什么,可以怎么用5.进阶用法6.常见错误以及学习指导建议 1.什么是curl 是利用URL语法在命令行下工作的开源文件传输工具。尤其被广泛应用的在linux系统下。 2.cu…...

零基础keil:设置注释快捷键

1.打开快捷键设置: 在Keil中,选择菜单栏中的“Settings”,然后选择“Shortcuts”来打开快捷键设置界面。 2.选择注释命令: 在快捷键设置界面中,找到与注释相关的命令,如“Comment Selection”&#xff0…...

Java中关于Optional的 orElse 操作,以及 orElse 与 orElseGet 的区别

文章目录 1. 大概说明2. 详细分析2.1 .orElse 操作2.2 .orElse 的作用:避免空指针异常2.3 为什么要用?2.4 orElseGet如何使用2.5 orElse和orElseGet的区别 1. 大概说明 这篇文章的目的是为了说明: orElse 如何使用orElseGet 如何使用两者的…...

TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)

TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave) 一、TCP三次握手(Three-way Handshake)二、TCP四次挥手(Four-way Wave)三、常见问题解答总结为什么三次握手不…...

python学智能算法(八)|决策树

【1】引言 前序学习进程中,已经对KNN邻近算法有了探索,相关文章链接为: python学智能算法(七)|KNN邻近算法-CSDN博客 但KNN邻近算法有一个特点是:它在分类的时候,不能知晓每个类别内事物的具…...

【经验】Orin系列Ubuntu远程桌面:VNC、NoMachine、URDC

1、VNC 1.1 Ubuntu端 1)安装VNC服务器 sudo apt install tigervnc-standalone-server2)安装xfce4 桌面 xfce4 用资源较GNOME ,KDE较少。适合老机器,轻量级桌面。与windows界面环境类似。 sudo apt install xfce4 xfce4-goodies也可以使用其它的桌面系统,可以使用如下命…...

【QT:控件】

目录 控件状态:​编辑 geometry : window frame windowlcon: qrc机制 qrc的使用方式: window opacity cursor font: ToolTip focusPolicy: styleSheet: 按钮类控件: PushButton: 给按钮添加图标: 给按钮添加快捷键…...

Python(最新版)集成开发环境PyCharm下载安装详细教程

Python 下载和安装 1.进入Python官网 Download Python | Python.org,点击Downloads,这里以Windows为例 2.选择下载Python 3.13.2 Windows 64位的版本。注意:不能在Windows 7 或更早的版本上使用。 3.打开文件,会自动出现安装界…...

PyTorch 实现 Conditional DCGAN(条件深度卷积生成对抗网络)进行图像到图像转换的示例代码

以下是一个使用 PyTorch 实现 Conditional DCGAN(条件深度卷积生成对抗网络)进行图像到图像转换的示例代码。该代码包含训练和可视化部分,假设输入为图片和 4 个工艺参数,根据这些输入生成相应的图片。 1. 导入必要的库 import …...

【BERT和GPT的区别】

BERT采用完形填空(Masked Language Modeling, MLM)与GPT采用自回归生成(Autoregressive Generation)的差异,本质源于两者对语言建模的不同哲学导向与技术目标的根本分歧。这种选择不仅塑造了模型的架构特性&#xff0c…...

PTA 7-12 排序

题目描述 给定 n 个(长整型范围内的)整数,要求输出从小到大排序后的结果。 本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下: 数据1:只有1个元素;数据2:11个不…...

uniapp 实现的步进指示器组件

采用 uniapp 实现的一款步进指示器组件,展示业务步骤进度等内容,对外提供“前进”、“后退”方法,让用户可高度自定义所需交互,适配 web、H5、微信小程序(其他平台小程序未测试过,可自行尝试) 可…...

大模型-提示词调优

什么是提示词 提示词(Prompt)在大模型应用中扮演着关键角色,它是用户输入给模型的一段文本指令 。简单来说,就是我们向大模型提出问题、请求或描述任务时所使用的文字内容。例如,当我们想让模型写一篇关于春天的散文&a…...

【k8s002】k8s健康检查与故障诊断

k8s健康检查与故障诊断 ‌一、集群状态检查‌ ‌检查节点健康状态‌ kubectl get nodes -o wide # 查看节点状态及基本信息 kubectl describe node <node-name> # 分析节点详细事件&#xff08;如资源不足、网络异常&#xff09; kubectl top nodes …...

统计数字字符个数(信息学奥赛一本通-1129)

【题目描述】 输入一行字符&#xff0c;统计出其中数字字符的个数。 【输入】 一行字符串&#xff0c;总长度不超过255。 【输出】 输出为1行&#xff0c;输出字符串里面数字字符的个数。 【输入样例】 Peking University is set up at 1898. 【输出样例】 4 【输出样例】 #in…...

CentOS 6 YUM源切换成国内yum源

由于 CentOS 6 已于 2020 年 11 月进入 EOL&#xff08;End of Life&#xff09;&#xff0c;官方软件源已不再提供更新&#xff0c;因此你可能会遇到 yum makecache 命令失败的问题。以下是解决该问题的详细步骤&#xff1a; ### 解决方案 1. **备份原有 yum 源文件** bash …...

继承知识点—详细

一&#xff1a;普通写法 package extend_;public class Extends01 {public static void main(String[] args) {Pubil pubil new Pubil();pubil.name"小明";pubil.age18;pubil.testing();pubil.setScore(60);pubil.showInfo();System.out.println("-----------…...

设备管理VTY(Telnet、SSH)

实验目的&#xff1a;物理机远程VTY通过telnet协议登录AR1,ssh协议登录AR2和sw 注意配置Cloud1&#xff1a; 注意&#xff01;&#xff01;博主的物理机VMnet8--IP&#xff1a;192.168.160.1&#xff0c;所以AR1路由0/0/0端口才添加IP&#xff1a;192.168.160.3&#xff0c;每个…...

Linux 中 Git 使用指南:从零开始掌握版本控制

目录 1. 什么是 Git&#xff1f; Git 的核心功能&#xff1a; 2. Git 的安装 Ubuntu/Debian 系统&#xff1a; 验证安装&#xff1a; 3.gitee库 4. Git 的首次配置 配置用户名和邮箱&#xff1a; 查看配置&#xff1a; 5. Git 的基本使用 初始化仓库 添加文件到暂存区…...

Linux 中的 likely 和 unlikely

1. 源码 # define likely(x) __builtin_expect(!!(x), 1) # define unlikely(x) __builtin_expect(!!(x), 0) 实际上就是通过GCC 的内建函数 __builtin_expect() 进行编译优化&#xff1a; long __builtin_expect (long exp, long c) 该函数是告诉编译器&#xff1a;参…...

CSS -属性值的计算过程

目录 一、抛出两个问题1.如果我们学过优先级关系&#xff0c;那么请思考如下样式为何会生效2.如果我们学习过继承&#xff0c;那么可以知道color是可以被子元素继承使用的&#xff0c;那么请思考下述情景为何不生效 二、属性值计算过程1.确定声明值2.层叠冲突3.使用继承4.使用默…...

百度贴吧IP和ID是什么意思?怎么查看

在百度贴吧这一充满活力的网络社区中&#xff0c;IP和ID是两个频繁出现的概念。它们各自承载着不同的意义和作用&#xff0c;对于贴吧用户而言&#xff0c;了解这两个概念有助于更好地参与社区互动、保护个人隐私以及维护社区秩序。本文将详细解析百度贴吧中IP和ID的含义&#…...

SpiderX:专为前端JS加密绕过设计的自动化工具

SpiderX 一、工具概述 SpiderX是一款专为解决前端JS加密问题而设计的自动化绕过工具。在网络安全领域&#xff0c;随着前端加密技术的普及&#xff0c;传统的爬虫和自动化测试工具在面对复杂的JS加密时显得力不从心。SpiderX应运而生&#xff0c;旨在通过自动化手段高效绕过前…...

基于银河麒麟系统ARM架构安装达梦数据库并配置主从模式

达梦数据库简要概述 达梦数据库&#xff08;DM Database&#xff09;是一款由武汉达梦公司开发的关系型数据库管理系统&#xff0c;支持多种高可用性和数据同步方案。在主从模式&#xff08;也称为 Master-Slave 或 Primary-Secondary 模式&#xff09;中&#xff0c;主要通过…...

【AWS入门】AWS云计算简介

【AWS入门】AWS云计算简介 A Brief Introduction to AWS Cloud Computing By JacksonML 什么是云计算&#xff1f;云计算能干什么&#xff1f;我们如何利用云计算&#xff1f;云计算如何实现&#xff1f; 带着一系列问题&#xff0c;我将做一个普通布道者&#xff0c;引领广…...