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

2024-01-13 21:52

本文主要是介绍(三)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 命令就可以了。

这篇关于(三)CMake为什么几乎一统C++跨平台构建?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/602917

相关文章

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

基于Python构建一个高效词汇表

《基于Python构建一个高效词汇表》在自然语言处理(NLP)领域,构建高效的词汇表是文本预处理的关键步骤,本文将解析一个使用Python实现的n-gram词频统计工具,感兴趣的可以了解下... 目录一、项目背景与目标1.1 技术需求1.2 核心技术栈二、核心代码解析2.1 数据处理函数2.2 数据处理流程

Python FastMCP构建MCP服务端与客户端的详细步骤

《PythonFastMCP构建MCP服务端与客户端的详细步骤》MCP(Multi-ClientProtocol)是一种用于构建可扩展服务的通信协议框架,本文将使用FastMCP搭建一个支持St... 目录简介环境准备服务端实现(server.py)客户端实现(client.py)运行效果扩展方向常见问题结

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示