mCube(硅科技)交付第5亿个加速计
06-06
前言自从接触C++以来,在项目中经常会接触到CMake进行编译构建,但对其缺乏系统的了解,遇到问题就陷入盲目。我对C++编译系统是如何发展的,为什么要使用CMake,它是如何工作的非常感兴趣,所以我想系统地学习它。
我编写了这篇文章作为入门指南。 GCC编译过程 GCC,全称GNU Compiler Collection(GNU编译器套件),是GNU项目开发的编译软件。
它可以编译多种编程语言,包括C、C++、Objective-C、Fortran、Ada等。GCC编译流程图引用自:
汇编:可以通过 gcc -c main.c 命令生成文件 main.o。链接:通过gcc main.o编译工具链可以生成a.out可执行文件。
编译工具链(Toolchain)是指用于将源代码转换为可执行文件或库的一组工具和程序。典型的编译工具链包括编译器、汇编器、链接器、库和调试器等组件。
Windows平台主要使用微软提供的工具链——MSVC。 Linux平台主要是GCC。
MacOS平台主要使用Clang和LLVM。随着项目越来越多,源代码文件增加,编译配置项根据场景越来越复杂(例如,Debug模式和Release模式下编译参数不同),构建系统也变得越来越复杂。
还是需要直接调用这些命令的时候会很复杂。我们需要编写大量复杂的命令行来完成一个复杂项目的编译。
基于这样的背景,我们提出了构建系统。 Linux/Unix上最古老的构建系统是make工具,与它一起工作的是Makefile配置文件。
Make是一个命令行工具,Makefiles配置文件指定了项目中的源代码、编译规则逻辑等信息。执行make时,会读取Makefile配置文件,生成GCC相关的调用命令行,然后调用GCC相关的命令行工具进行编译构建。
引用图片:它是C++中广泛使用的开源构建系统工具,支持多种编译器和平台。它通过生成本机构建系统(例如 Makefile、Visual Studio 项目文件等)来实现跨平台构建。
包管理器的早期 在 C++ 的早期,开发人员主要依赖于手动管理库和依赖项。这通常涉及下载源代码或预编译的二进制文件,然后将它们集成到项目中。
这种方式虽然灵活,但容易出错且难以维护。 Autotools 和 CMake 随着项目规模和复杂性的增长,Autotools 和 CMake 等构建系统变得流行。
这些工具帮助开发人员自动化构建过程,但它们不是包管理器。它们主要解决构建和配置问题,而不是依赖管理。
pkg-configpkg-config 是一个管理编译和链接参数的工具,广泛用于 Unix 系统。虽然简化了库的使用,但仍然需要手动安装和管理库。
ConanConan 是一个现代的跨平台 C++ 包管理器,旨在解决依赖管理问题。它支持多种构建系统(例如CMake、Autotools、MSBuild等),并且可以与CI/CD管道集成。
Conan 提供了一个中央存储库(Conan Center),开发人员可以在其中发布和查找包。 vcpkgvcpkg 是 Microsoft 开发的 C++ 包管理器,专注于简化库获取和集成。
它专为 Windows 平台设计,但也支持 Linux 和 macOS。 vcpkg 提供了一个中央存储库,用户可以在其中轻松安装和管理库 HunterHunter 是另一个基于 CMake 的 C++ 包管理器。
它通过 CMake 的外部项目功能管理依赖项,适用于已使用 CMake 作为构建系统的项目。 BuckarooBuckaroo 是一个基于 Buck 构建系统的 C++ 包管理器。
它旨在提供快速、可重复的构建并支持跨平台开发 CPMCPM 是一个基于 CMake 的轻量级包管理器,它使用 CMake 的 FetchContent 模块来下载和管理依赖项。它适合希望最小化外部依赖的项目。
C++编译系统的演变总结。本文从最早的手动管理依赖关系开始介绍C++编译系统。
随着项目复杂性的增加,它已经演变成针对不同平台的本地构建系统。面对一致性和可维护性的问题,它发展成了一个跨界的系统。
它是平台构建系统的工具。后来开发了包管理器来满足代码仓库依赖管理的需求。
罗马不是一天建成的。 C++编译系统也随着软件工程的发展而逐渐演变。
我们可以根据不同的业务需求选择相应的工具。通过了解编译系统的开发,可以更深入的了解自己项目的编译构建问题,从而提高自己的项目工程组织能力,提高效率。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-06
06-17
06-17
06-17
06-18
06-17
06-17
06-18
06-18
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用