接前文:Linux软件包(源码包和二进制包)及其区别和特点

在前文,我们知道了linux软件包分为源码包和二进制包两种方式,而不同的发行版之间又有着自己的二进制打包格式。

首先,软件运行依赖着各种各样的库,那么安装软件时到底是选择自带依赖库还是共享对象库之间就产生了分歧。最具有代表性的就是Microsoft的msi与linux各种发行版的打包格式的分歧。

Windows - MSI

  MSI文件是Windows Installer的数据包,它实际上是一个数据库,包含安装一种产品所需要的信息和在很多安装情形下安装程序所需的指令和数据。MSI文件将程序的组成文件与功能关联起来。此外,它还包含有关安装过程本身的信息:如安装序列、目标文件夹路径、系统依赖项、安装选项和控制安装过程的属性。

linux各种发行版

  如DPKG、RPM等。

MIS与DPKG、RPM等

  对于这几种方式的分歧,实则无好坏之分。在我看来,autotools、dpkg、msi 分别是基于源码、共享对象库、静态链接下最佳的软件包解决方案。这三个方案各有优缺点,但由于他们基于不同的开发方式、商业模式,是不能相互替换的。

  比方说,你不能在 Windows 上用 dpkg 去发布软件,因为商业软件为了便于技术支持往往是静态链接或者打包所有依赖的,客户环境的不确定对你来说是个灾难。如果软件包自带依赖,这样就不需要一个全局包管理器了(主要是因为商业软件的需要,Linux因为基于开源环境才有可能做全局包管理)。用户也可以安装同一个软件的多个版本实例,互不干扰。目前msi的做法就很好,用户指定一个安装目录就行了,方便的操作这点对于普通用户来说至关重要(当然也是被巨佬们诟病的对象)。但是缺点在于没有一个全局的安装包管理,windows下的安装/卸载几乎必然会造成垃圾遗留,因为一个程序它无法知道它安装的dll是它自己的还是别的程序的,于是卸载就不会删除。这也是windows用久之后会变慢的一大原因。(当然,在installer的作者用心去写的情况下,写的好的软件,卸载自然不会有太多的垃圾残留。自带依赖根本不会让软件膨胀多少,膨胀的部分往往不是库而是资源文件、帮助文档之类)

  你也不能把 Linux 上所有开源软件全换成 msi 那种形式。在 Linux 上开发通常会用到很多比较 high-level 的库。每个库功能很专一,但也很全面,比方说 OpenSSL 就提供加密相关的功能,但它支持很多加密算法,所以每个库也可能比较大。如果全用静态链接,出来的每个二进制文件里有很多依赖是重复的,比方说 glibc、libstdc++、zlib 等等。这样每个二进制文件几 M 甚至几十 M。在linux全局包管理的方式下用户能够方便的对包进行管理(不会出现Windows下卸载一个软件要找出十几个依赖的库/软件进行删除的情况,不用进行十几次繁琐的删除引导程序),用户也不用自己对库的版本进行控制,非常方便。

所以为什么linux发行版之间有着不同的二进制软件包标准?

首先linux 本质就是个核,核以上的事情都是发行版自行处理的,而大多数软件又都是动态链接的,各个linux发行版系统的结构不同导致了library 版本又各自不同,所以才会有这种兼容性问题(这种兼容性问题主要是在于一些与系统本身机构关系很大的软件, 但普通的应用软件实际上并没有要特殊处理的地方 ,理想状态下是可以实现采用统一打包方式的。)。在 Windows 上这叫做 dll hell,但是 Windows 操作系统这一块因为它从核到用户态都是封闭的,所以兼容性要好很多。这个问题更多的像是一个社会问题而不是一个技术问题。当然这也导致了一些问题,如限制了新软件的传播(对于不同的发行版都进行分别打包这是要要了程序员的狗命吗?滑稽~)

参考文章:https://www.v2ex.com/t/57266

软件自带依赖库还是共享对象库/为什么linux发行版之间不能有一个统一的二进制软件包标准的更多相关文章

  1. QTP设置共享对象库

    第一步:把需要加到共享对象库中的各个用例脚本的对象库,分别导出成.tsr文件. 操作方法:先用QTP打开已经录制完毕的脚本后,选择Resources-->Object Repository.然后 ...

  2. 常见的LINUX发行版安装libiconv库方法

    今天编译程序,发现程序报错,如下 cannot find -liconv collect2: ld returned 1 exit status 或者 undefined reference to ` ...

  3. 分析并解决Linux发行版的自带OpenJdk和自己安装的OracleJdk新旧版本冲突问题

    解决办法: 从Oraclejdk 目录里可执行文件链接都复制到自己的LINK目录,然后IDE使用LINK变量下的命令 本文没有具体解决方法,只有探索思路........................ ...

  4. linux系统——ld-linux.so.X查找和加载共享动态库的顺序

    ld-linux.so查找共享库的顺序: Glibc安装的库中有一个为ld-linux.so.X,其中X为一个数字,在不同的平台上名字也会不同.可以用ldd查看: #ldd /bin/cat linu ...

  5. 介绍n款计算机视觉库/人脸识别开源库/软件

    计算机视觉库 OpenCV OpenCV是Intel®开源计算机视觉库.它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV 拥有包括 300 多个 ...

  6. Flash本地共享对象 SharedObject

    以下内容是对网上一些资料的总结 Flex SharedObject 介绍(转自http://www.eb163.com/club/thread-3235-1-1.html): Flash的本地共享对象 ...

  7. 通过Python自带模块SimpleHTTPServer快速共享服务的配置文件

    简介 SimpleHTTPServer是Python 2自带的一个模块,是Python的Web服务器,简单小巧,快速启动. 它在Python 3已经合并到http.server模块中. SimpleH ...

  8. iOS 静态库和动态库的区别&静态库的生成

    linux中静态库和动态库的区别 一.不同 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函 ...

  9. 《Java并发编程实战》学习笔记 线程安全、共享对象和组合对象

    Java Concurrency in Practice,一本完美的Java并发参考手册. 查看豆瓣读书 推荐:InfoQ迷你书<Java并发编程的艺术> 第一章 介绍 线程的优势:充分利 ...

随机推荐

  1. pipline中执行shell脚本推送镜像并且部署

    实验架构: 192.168.0.96 gitlab 192.168.0.97 jenkins 192.168.0.98 harbor.docker集群 说明:下面代码编译镜像那一步的代码必须靠左,目的 ...

  2. python:如何传递一个列表参数

  3. LeetCode 671. 二叉树中第二小的节点(Second Minimum Node In a Binary Tree) 9

    671. 二叉树中第二小的节点 671. Second Minimum Node In a Binary Tree 题目描述 给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 ...

  4. java后台面试之计算机网络问题集锦

    1.http和https的区别 2.对称加密和非对称加密 3.三次握手与四次挥手的流程 4.为什么TCP需要三次握手?两次不可以吗?为什么 5.为什么TCP挥手需要四次?三次不行吗? 6.TCP协议如 ...

  5. [WinForm] - "更新 DataSet 应用程序集对象失败,Visual Studio 自动重启" 之解决

    背景 在 WinForm 解决方案中,更新 DataSet 应用程序集对象失败,Visual Studio 自动重启. 试一试 1. 更新 .xsd 时打开对应的 .Designer.cs.2. 如果 ...

  6. STM32之复用功能

    复用功能分复用输入,复用输出,STM32芯片内部集成多种模块,如GPIO.串口.i2c等,为使IO端口支持这些模块,厂家对IO端口进行扩展,同一个端口通过设置寄存器会有不同的功能.如下图IO结构图: ...

  7. stm32片上ADC转换实验

    原理图所示: BAT_DET 接到PB0 引脚,VSYS 是直流3.7V的电压.再来看下103的adc转换和引脚GPIO的关系 我们直接选用ADC1 根据上表格只能使用通道8 下面给我常用的ADC1寄 ...

  8. PowerBuilder学习笔记之2PowerScript语言(二)

    z教材地址:https://wenku.baidu.com/view/1e82d26925c52cc58ad6be05.html?sxts=1565679996440 2.4数组 声明数组:Integ ...

  9. 基于thymeleaf实现简单登录

    1.引入thymeleaf.静态资源等依赖 <dependency> <groupId>org.springframework.boot</groupId> < ...

  10. MySQL 5.7使用xtabackup报错解决

    报错信息: InnoDB: An optimized (without redo logging) DDLoperation has been performed. All modified page ...