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

相关文章

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

一文详解如何从零构建Spring Boot Starter并实现整合

《一文详解如何从零构建SpringBootStarter并实现整合》SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序,:本文主要介绍如何从... 目录一、Spring Boot Starter的核心价值二、Starter项目创建全流程2.1 项目初始化(

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque