C 以及 C++ 虽然经历过标准化,但缺乏单一的掌控者。现实世界里的 C/C++ 犹如神圣罗马帝国,固然有一个委员会在名义上号令天下,但事实上是各路诸侯的方言割据:Vistual Studio 的 C 与 GCC 的 C 不一样,而 GCC 的 C 又与 Clang 的 C 不一样;除去这些巨头之外,又有 Intel 的 C、Borland 的 C、K&R C、甚至谭浩强的 C,它们彼此都不尽相同;而如果愿意再细分的话,每一类处理器、操作系统、函数库的 C 都有或多或少的不同。

具体不同在何处呢?举例而言,在语法层面上,GCC 为 C 增加了许多扩展

这种纷乱的异构盛况,其他语言也不是没有,但在 C/C++ 这边是如此严重,使得维护一个像 pip 这样(在大部分时候)可以跨硬件架构、跨操作系统、跨语言版本、跨工具链的包管理工具变得极为困难。而且大多数 C 开发者事实上并没有这样的需求,因为需要用 C 语言做的事情通常比较底层,与操作系统紧密相关,甚至就是用来开发操作系统本身,毕竟它诞生的使命就是开发 Unix。五十年过去,现代 Unix-like 操作系统仍旧紧密围绕着 C 构建而成,而这些操作系统的包管理工具实际上也管理着一部分 C/C++ 的生态。许多为人熟知的 Linux 发行版将软件包分为「实体包」和「开发包」两类,通过同一套命令安装;BSD 则有「二进制包管理」和「源代码包管理」之区分,通过 package 和 port 两套系统完成。

以正则表达式库 PCRE 为例,在 Debian / Redhat 一类发行版上,`apt install libpcre3` / `yum install pcre` 会安装已经编译好的二进制文件到 /lib 中,`apt install libpcre3-dev` / `yum install pcre-devel` 则会安装对应的头文件到 /usr/include 中去

当然,系统级别的包管理器毕竟由管理系统的角度而设计,无法(很好地)解决一些软件开发所需解决的专门问题,比如多个版本的并存,依赖关系的管理,乃至于软件的调试、包装和部署。所以为了 C/C++ 而专门设计的包管理器同样存在,目前看起来发展相对成熟,用户群也相对稳定的,大概是 JFrog 的 Conan

那么 Conan 跟 vcpkg 如何解决「跨硬件架构、跨操作系统、跨语言版本、跨工具链」来维护程序包这个问题呢?vcpkg 解决得并不太好,至少目前(二〇二〇年底)它的出发点其实还是以 Visual Studio C++ 项目为优先服务对象提供解决方案。而 Conan 相对而言比较全面,但机制也更复杂:先以名为 conanfile.py 的 Python 脚本来描述一个包所适用的架构、操作系统、编译类型、以及其依赖,并根据其中与编译相关的条件生成一个 hash,然后将源代码或者二进制库和头文件分别按照 hash 打包。包的使用者则自行指定、或要求 Conan 自动检测所在编译环境,也生成一个 hash,据此下载对应的包,然后 Conan 根据脚本进行需要的编译、patch 等工作,然后将头文件与二进制库的路径生成为可以被 MSBuild、CMake、QMake 等构建工具所使用的文件。

这个答案一直在我草稿箱里扔了五六年,刚写好时觉得这是典型的用很多废话来回答简单的问题,想想还是算了。而今天写 conanfile 到痛不欲生又想起它,感觉还是解释了一个内行人肯定知晓、新手却未必了然的现况,就决定还是改一下发布出来。五六年后的世界还是变化很大的,知乎早已不是那个知乎(划掉)比如 vcpkg 这个东西,这问题提出来的时候还根本不存在。

C 语言很古老,但并不意味着它已经停止演进——嗯,我这里顺便推一本书,21st Century C: C Tips from the New School:

以及,如果你还不知道的话,《C专家编程》,这本倒是有中文版:

参考

python中有很多包管理工具有哪些不是_C 语言中有没有类似 Python 中 pip 的包管理工具?...相关推荐

  1. python包管理工具 ports_MacPorts安装使用Python/pip

    Mac OS未预装任何在Unix/Linux中常见的命令行包管理工具,Mac OS中的App Store和自身的软件升级功能可以下载更新许多比较好的应用,但这些应用多数是满足普通消费者需求,对于开发人 ...

  2. python中有很多包管理工具那中不是_Python中的包管理工具PIP,pip

    1.1.4节 -- Python的包管理工具pip pip包 pip list(退出python环境后再输入)  列出匹配管理的包有哪些 pip install 包名        安装一个包(默认安 ...

  3. Python包管理工具小结

    此文已由作者张耕源授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 作为一名接触Python有一段时间的初学者,越来越体会到Python的方便之处,它使人能更 多的关注业务本身 ...

  4. Python 包管理工具解惑

    本文转载自http://zengrong.net/post/2169.htm,感谢原作者. 一.困惑 作为一个 Python 初学者,我在包管理上感到相当疑惑(嗯,是困惑).主要表现在下面几个方面: ...

  5. python模块版本管理工具_【转】Python包管理工具

    Python 包管理工具解惑 本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商: 本站部分原创和翻译文章提供m ...

  6. python软件怎么使用-Python快速入门—如何选择使用包管理工具?

    原标题:Python快速入门-如何选择使用包管理工具? 源 | cnblogs文 | 包子 在Python环境中已经有很多成熟的包,可以通过安装这些包来扩展我们的程序. 例如,很多时候Python开发 ...

  7. python管理包管理工具pip和conda使用,及使用pip和conda创建虚拟环境

    python管理包管理工具pip使用,及使用pip创建虚拟环境 文章目录: 1 pip的使用 1.1 pip的基础使用 1.1.1 pip安装库包(pip install) 1.1.2 pip卸载库包 ...

  8. Python之包管理工具

    在Python环境中已经有很多成熟的包,可以通过安装这些包来扩展我们的程序. 例如,很多时候Python开发人员都会去PyPI网站去查找自己想要使用的包,然后进行安装.PyPI ( Python Pa ...

  9. 新一代的 Python 包管理工具 -- PDM

    PDM 是一个新的 Python 的包管理器,也许你还未知晓它的存在,但实际上PDM 已经诞生两年,并在 2021 年发布 1.0 版本,目前最高的版本是 1.12.8. 在刚听到 PDM 时,我下意 ...

最新文章

  1. 记一次大规模数据迁移和加密
  2. 工作中用不到的技术要不要学?
  3. 创建一个显示所有预定义WPF颜色的ListBox
  4. Windows phone 应用开发[12]-Pex 构建自动化白盒测试[下]
  5. 第一个Mybatis程序示例 Mybatis简介(一)
  6. 解密Redis持久化
  7. 关于事件的一点小总结
  8. 如何在C#控件中画点并获得指定点的像素颜色
  9. LwIP应用开发笔记之三:LwIP无操作系统UDP客户端
  10. PHP登录表单提交前端验证,form表单提交前先用ajax进行验证(前端)
  11. 【滤波器】基于matlab升余弦滤波器【含Matlab源码 993期】
  12. 《maven实战》学习笔记2——maven安装(windows和eclipse插件)
  13. h5商城模板_几个常用H5制作软件、网站推荐
  14. 微信怎么at所有人_变速箱报废、发动机故障、车门下沉,全新马自达3到底怎么了?...
  15. QCA-WIFI技术研讨
  16. 第1章 iFIX概述
  17. 关于结合二阶条件(海森矩阵)来判断非凸函数极值问题?
  18. 2个最好的中文图标搜索引擎
  19. 现代电力电子期末考试
  20. 执行脚本报:ORA-24344: success with compilation error

热门文章

  1. java如何保证mq一定被消费_消费端如何保证消息队列MQ的有序消费
  2. ajax请求获取服务器数据,jquery.ajax发布从app引擎服务器获取数据的请求
  3. python定义构造函数、包括颜色价格品牌_《Python编程与算法基础教程》(第二版),蒋洪宇,青松,第9章:课后练习,程序设计,版江红余,第九章,习题,答案...
  4. 使用Amazon Simple Queue Service(SQS) 实现简单的消息服务
  5. git clone 失败
  6. BZOJ2005: [Noi2010]能量采集 莫比乌斯反演的另一种方法——nlogn筛
  7. javascript OOP 面向对象编程
  8. 深入 理解 Statement 和 PreparedStatement 【转】
  9. 关于《用C#编写ActiveX控件》的几点说明
  10. [Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、键盘鼠标操作)