(三)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

相关文章

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

Spring Boot Maven 插件如何构建可执行 JAR 的核心配置

《SpringBootMaven插件如何构建可执行JAR的核心配置》SpringBoot核心Maven插件,用于生成可执行JAR/WAR,内置服务器简化部署,支持热部署、多环境配置及依赖管理... 目录前言一、插件的核心功能与目标1.1 插件的定位1.2 插件的 Goals(目标)1.3 插件定位1.4 核

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被