(三)CMake为什么几乎一统C++跨平台构建?

先看几个简单的例子再回头来看这个问题
回想一下当我们用windows写C++第一个Hello World!的步骤,先用VS IDE 创建一个控制台的工程,IDE 会自动生成一个 cpp 文件,里面有一句 输出"Hello World!" 代码,这个时候按下F5 就可以启动调试,一个黑乎乎的控制台窗口上显示了"hello world"

#include <iostream>
int main()
{
    std::cout << "Hello World!\n";
}

所有人都把注意力放在了这个cpp文件上,几乎不会有人关注工程文件,无论是VS 生成的工程还是 XCode生成的工程。那这个工程文件有什么作用呢?

组织代码文件

工程文件定义了项目的结构,包括项目中的源文件、头文件、资源文件等的组织方式们,我们可以在IDE 上查看和管理项目的所有文件,组织代码文件的结构

配置项目属性

工程文件中包含了项目的配置选项,如编译器选项、链接器选项、预处理器选项,头文件包含选项等。

编译和构建项目

工程文件定义了项目的编译和构建过程。源代码文件只有加入到了工程中才能参与编译, 可以在工程中指定项目中的源文件、库文件、依赖项等,并设置编译器和构建工具的参数,从而进行项目的编译和构建。

调试

所有的开发者一定会用到的核心功能,有了工程文件我们才能用IDE来打开工程,然后一键方便调试。当然不使用IDE 也能调试,但是极其的麻烦,对于客户端开发来说调试是基础技能。

所以工程文件有巨大的作用,特别是项目大的时候。谈到了这么多工程文件的作用,那和CMake 有什么关系呢?

再继续说一下跨平台的C++ 开发,C++一个巨大特点 一次编写多个平台编译。既然要编译那就需要有“规则”,无论是以前的makefile 文件还是工程文件都是在制定这个规则并且按照规则来编译。在CMake 之前也有很多的制定“规则“的工具,而CMake和他们最大的不同是可以生成各个 IDE 的工程文件,然后使用IDE 软件打开工程文件就可以一站式编写代码,调试代码。CMake 的语法非常简单,可以直接在CMake 中制定各种规则,然后生成各个IDE 的工程。
当有多个人共同开发项目的时候工程文件是最容易冲突的,并且工程文件一般都会比较大,格式很复杂,当出现冲突的时候解决起来也是非常的麻烦。而CMake 可以消除工程文件的冲突,因为使用CMake 根本不需要将工程文件push到代码仓库中,各个开发者将代码pull到本地之后执行一下CMake脚本就可以生成工程文件。 虽然CMakeLists.txt 文件本身也会存在冲突,但是这个就非常容易解决。

2 CMake 特点

2.1 生成不同的IDE 工程文件

CMake 可以根据用户的操作系统和目标平台生成不同的构建系统文件,如 Makefile、Ninja 等,VS 的project, XCode 工程,QT 也支持CMake导入工程。

2.2 支持丰富的IDE

CMake 会根据操作系统列出所有支持的IDE以及工程文件,并且还可以自定义编译交叉编译工具链。在这里插入图片描述

2.3 提供跨平台的命令和变量

CMake 的语法很简单,CMake 提供了丰富的命令和变量来制定编译链接规则,可以使用这些命令和变量来描述项目的构建过程和依赖关系,而不需要关心具体的平台细节。这样一来,开发者可以使用相同的 CMake 配置文件在不同的操作系统上进行构建,实现跨平台统一构建。

自动化依赖管理

CMake 能够自动管理项目的依赖关系,包括库文件、头文件、编译选项等。我们只需要在 CMake 配置文件中指定依赖,并在项目中引用这些依赖。

3 CMake 示例

以下是一个使用CMake生成一个C++ helloworld示例的步骤:

  1. 创建一个文件夹用于存放项目文件,例如helloworld_project
  2. helloworld_project文件夹中创建一个CMakeLists.txt文件,内容如下:
cmake_minimum_required(VERSION 3.10)

project(helloworld)

add_executable(helloworld main.cpp)
  1. helloworld_project文件夹中创建一个main.cpp文件,内容如下:
#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}
  1. 打开命令行,cd 到 helloworld_project 目录下,执行命令就可以生成vs2022 的工程文件了。
cmake . -G"Visual Studio 17 2022" -B./build

如果需要将上面的工程放到其他平台编译,也只需要在其他平台执行一下CMake 命令就可以了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/318206.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PTA 1117 数字之王 C++实现 简易代码

给定两个正整数 N1​<N2​。把从 N1​ 到 N2​ 的每个数的各位数的立方相乘&#xff0c;再将结果的各位数求和&#xff0c;得到一批新的数字&#xff0c;再对这批新的数字重复上述操作&#xff0c;直到所有数字都是 1 位数为止。这时哪个数字最多&#xff0c;哪个就是“数字…

在线直线度测量仪确保了出厂圆棒无不合格品

在线直线度测量仪确保了出厂圆棒无不合格品 随着生产设备的改进&#xff0c;利用基础材料进行生产的厂家对品质要求也越来越高&#xff0c;其中圆形棒管材的直线度尺寸&#xff0c;也是广受关注&#xff0c;对其进行矫直检测&#xff0c;使其出厂无不合格品。 变抽检为全检 以前…

逼格满满,推荐一个高效测试用例工具:XMind2TestCase !

一、背景 软件测试的核心是什么&#xff1f;毫无疑问是测试分析和测试用例设计&#xff0c;也是日常测试投入最多时间的工作内容之一。 然而&#xff0c;传统的测试用例设计过程有很多痛点&#xff1a; 1、使用Excel表格进行测试用例设计&#xff0c;虽然成本低&#xff0c;但…

Java 并发性和多线程3

七、线程安全及不可变性 当多个线程同时访问同一个资源&#xff0c;并且其中的一个或者多个线程对这个资源进行了写操作&#xff0c;才会产生竞态条件。多个线程同时读同一个资源不会产生竞态条件。 我们可以通过创建不可变的共享对象来保证对象在线程间共享时不会被修改&…

Github 2FA验证的解决方法

当前使用GitHub需要启用 2FA 验证&#xff0c;也就是除了账号密码外还有一个实时码&#xff0c;需要额外输入这个正确的实时码才能开启 2FA 验证和后续登陆。 浏览器插件 这是目前我在使用的方法。在浏览器中添加一个叫做Authenticator的插件&#xff0c;传送地址&#xff1a;…

MySQL 和 Redis 如何保证数据一致性,通过MySQL的binlog实现

1、简介 MySQL 和 Redis 如何保证数据一致性&#xff0c;目前大多讨论的是先更新Redis后更新MySQL&#xff0c;还是先更新MySQL 后更新Redis&#xff0c;这两种方式在实际的应用场景中都不能确保数据的完全一致性&#xff0c;在某些情况下会出现问题&#xff0c;本文介绍使用 C…

京东宣布启动鸿蒙原生应用开发,全力支持鸿蒙生态 | 百能云芯

华为常务董事、终端BG CEO、智能汽车解决方案BU董事长余承东于1月10日在微博上发布了一条令人振奋的消息&#xff1a;京东即将启动鸿蒙原生应用的开发。这一消息在科技圈掀起了不小的波澜&#xff0c;也为鸿蒙系统的发展注入了新的动力。 京东集团首席执行官兼执行董事许冉和余…

RPN(Region Proposal Networks)候选区域网络算法解析(附PyTorch代码)

0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解及成果&#xff0c;但是内容可能存在不准确的地方。如果发现文中错误&#xff0c;希望批评指正&#xff0c;共同进步。 本文基于论文Faster R-CNN: Towards…

大一统的监控探针采集器 cprobe

需求背景 监控数据采集领域&#xff0c;比如 Prometheus 生态有非常多的 Exporter&#xff0c;虽然生态繁荣&#xff0c;但是无法达到开箱即用的大一统体验&#xff0c;Exporter 体系的核心问题有&#xff1a; 良莠不齐&#xff1a;有的 Exporter 写的非常棒&#xff0c;有的…

uniapp怎么开发插件并发布

今天耳机坏了,暂时内卷不了,所以想开发几个插件玩玩,也好久没写博客了,就拿这个来写了 首先,发布插件时需要你有项目 这里先拿uniapp创建一个项目, 如下,创建好的项目长这样 然后根据uniapp官网上说的,我们发布插件时,需要在uni_modules里面编写和发布 ps:还需要使用uniapp…

计算机组成原理期末复习

文章目录 第一章&#xff1a;计算机系统漫游编译系统进程线程之间的关系存储器层次结构虚拟地址 第二章&#xff1a;信息的表示和处理大端与小端整数运算浮点数运算 第三章&#xff1a;程序的机器级表示栈的压入和弹出算数与逻辑运算操作指令条件判断与循环 第六章&#xff1a;…

U盘抜太快打不开恢复方法

U盘是一种常用的存储设备&#xff0c;由于其便携性和大容量等特点&#xff0c;被广泛应用于数据存储和传输。然而&#xff0c;有时候我们会遇到U盘拔出后无法再次使用的问题&#xff0c;这通常是由于U盘拔出太快导致的。本文将深入探讨U盘拔太快打不开的原因&#xff0c;并提供…

【elfboard linux 开发板】10. 设备树与烧录

1. 设备树介绍 设备树由一系列被命名的node和property组成 可以描述如下信息&#xff1a; CPU的数量和类别内存基地址和大小总线和桥外设连接中断控制器和中断使用情况GPIO控制器和GPIO使用情况Clock 控制器和 Clock 使用情况 由dts文件以文本方式对系统设备树进行描述&…

GPT-4V的图片识别和分析能力原创

GPT-4V是OpenAI开发的大型语言模型&#xff0c;是GPT-4的升级版本。GPT-4V在以下几个方面进行了改进&#xff1a; 模型规模更大&#xff1a;GPT-4V的参数量达到了1.37T&#xff0c;是GPT-4的10倍。 训练数据更丰富&#xff1a;GPT-4V的训练数据包括了1.56T的文本和代码数据。 …

Ubuntu 22.04 安装prometheus

服务器监控和报警软件有很多&#xff0c;为什么我们会选择Prometheus而不是其他软件呢&#xff1f; 因为它有以下优点&#xff1a; 自带简易web监控页面&#xff0c;用户可以很方便地查看监控数据和使用仪表盘。能实时收集数据并根据自定义警报规则推送告警&#xff1b;具有丰…

力扣双周赛第三题----2857. 统计距离为 k 的点对

这题我们的暴力做法就是o(n^2),但是根据数据量这样会超时&#xff0c;所以我们不能用暴力解法去解决 那么想一想双指针可以吗&#xff0c;不可以。为什么呢&#xff1f;因为他没有一个特性可以让他双指针跳过前面或者后面一个点。比如他们数组有顺序的情况下&#xff0c;还有一…

【JaveWeb教程】(23) MySQL数据库开发之事务与索引 详细代码示例讲解(最全面)

目录 2. 事务2.1 介绍2.2 操作2.3 四大特性 3. 索引3.1 介绍3.2 结构3.3 语法 2. 事务 场景&#xff1a;学工部整个部门解散了&#xff0c;该部门及部门下的员工都需要删除了。 操作&#xff1a; -- 删除学工部 delete from dept where id 1; -- 删除成功-- 删除学工部的员工…

某厂校招一道关于C的笔试题

一、笔试原题 题目&#xff1a;在Linux x86 _ 54 gcc环境下&#xff0c;下面的程序会出现什么问题&#xff1f;运行结果是什么&#xff1f;为什么&#xff1f; 程序如下图&#xff1a; 通过在gcc的环境下编译运行&#xff0c;发现运行结果为不断死循环打印0-17的数字 我们…

遥感影像-语义分割数据集:高分卫星-云数据集详细介绍及训练样本处理流程

原始数据集详情 简介&#xff1a;该云数据集包括RGB三通道的高分辨率图像&#xff0c;包含高分一、高分二及宽幅数据集。 KeyValue卫星类型高分系列覆盖区域未知场景未知分辨率1m、2m、8m数量12000单张尺寸1024*1024原始影像位深8位标签图片位深8位原始影像通道数三通道标签图…

云卷云舒:AI for DB、DB for AI

云卷云舒&#xff1a;算力网络云原生&#xff08;下&#xff09;&#xff1a;云数据库发展的新篇章-CSDN博客https://blog.csdn.net/bishenghua/article/details/135050556 随着数据库和AI技术的分支同向演进&#xff0c;AI 和数据库间的关联越发紧密了。 大模型的演进发展&a…