软件自带依赖库还是共享对象库/为什么linux发行版之间不能有一个统一的二进制软件包标准
在前文,我们知道了linux软件包分为源码包和二进制包两种方式,而不同的发行版之间又有着自己的二进制打包格式。
首先,软件运行依赖着各种各样的库,那么安装软件时到底是选择自带依赖库还是共享对象库之间就产生了分歧。最具有代表性的就是Microsoft的msi与linux各种发行版的打包格式的分歧。
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发行版之间不能有一个统一的二进制软件包标准的更多相关文章
- QTP设置共享对象库
第一步:把需要加到共享对象库中的各个用例脚本的对象库,分别导出成.tsr文件. 操作方法:先用QTP打开已经录制完毕的脚本后,选择Resources-->Object Repository.然后 ...
- 常见的LINUX发行版安装libiconv库方法
今天编译程序,发现程序报错,如下 cannot find -liconv collect2: ld returned 1 exit status 或者 undefined reference to ` ...
- 分析并解决Linux发行版的自带OpenJdk和自己安装的OracleJdk新旧版本冲突问题
解决办法: 从Oraclejdk 目录里可执行文件链接都复制到自己的LINK目录,然后IDE使用LINK变量下的命令 本文没有具体解决方法,只有探索思路........................ ...
- linux系统——ld-linux.so.X查找和加载共享动态库的顺序
ld-linux.so查找共享库的顺序: Glibc安装的库中有一个为ld-linux.so.X,其中X为一个数字,在不同的平台上名字也会不同.可以用ldd查看: #ldd /bin/cat linu ...
- 介绍n款计算机视觉库/人脸识别开源库/软件
计算机视觉库 OpenCV OpenCV是Intel®开源计算机视觉库.它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV 拥有包括 300 多个 ...
- Flash本地共享对象 SharedObject
以下内容是对网上一些资料的总结 Flex SharedObject 介绍(转自http://www.eb163.com/club/thread-3235-1-1.html): Flash的本地共享对象 ...
- 通过Python自带模块SimpleHTTPServer快速共享服务的配置文件
简介 SimpleHTTPServer是Python 2自带的一个模块,是Python的Web服务器,简单小巧,快速启动. 它在Python 3已经合并到http.server模块中. SimpleH ...
- iOS 静态库和动态库的区别&静态库的生成
linux中静态库和动态库的区别 一.不同 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函 ...
- 《Java并发编程实战》学习笔记 线程安全、共享对象和组合对象
Java Concurrency in Practice,一本完美的Java并发参考手册. 查看豆瓣读书 推荐:InfoQ迷你书<Java并发编程的艺术> 第一章 介绍 线程的优势:充分利 ...
随机推荐
- ABAP语法篇2 内表操作语法
VALUE MOVE-CORRESPONDING CORRESPOING FOR REDUCE GROUP BY FILTER VALUE语法: 结构赋值 ... VALUE dtype | #( ...
- systemctl service
一.systemctl常用命令 systemctl list-units ##列出当前系统服务的状态 systemctl list-unit-files ##列出服务 ...
- Swift4.0复习Optional
1.Optional基本使用: 当我们声明一个Optional对象时,无论该对象是在文件作用域还是在函数体内作为局部对象声明,如果不对它初始化,那么它的值默认为空(nil). // 声明a为Int类型 ...
- Linux使用sleep进行延迟实验
sleep命令可以延迟脚本执行一段时间(以秒为单位).下面的命令使用tput和sleep从0开始计时到40秒: #/bin/bash echo Count: tput sc # 循环40s for c ...
- MYSQL 递归操作
MYSQL 递归? ===================== 表: t_node node_id int node_name varchar2(45) parent_id int 级, ...
- The underlying connection was closed: The connection was closed unexpectedly.
基础连接已经关闭: 连接被意外关闭. 基础连接已经关闭: 发送时发生错误 防火墙问题.或是杀毒软件,卫士之类的.(360 卸载 )
- consui(二)集群配置
consul集群搭建:一.软件安装Linux 环境下载zip包然后直接解压,然后把解压的文mv consul /bin检验安装是否成功,查看版本[root@node1 ~]consul -vConsu ...
- mysql explain中key_len的作用
mysql explain中key_len的作用key_len越小 索引效果越好 name的字段类型是varchar(20),字符编码是utf8,一个字符占用3个字节,那么key_len应该是 20* ...
- 学习记录:《C++设计模式——李建忠主讲》7.“领域规则”模式
领域规则模式:在特定领域中,某些变化虽然频繁,但可以抽象为某种规则.这时候,结合特定的领域,将问题抽象为语法规则,从而给出该领域下的一般性解决方案. 典型模式:解释器模式(Interpreter). ...
- 039 Android ShareSDK实现分享功能
1.参考文献: https://blog.csdn.net/augfun/article/details/86551294 http://wiki.mob.com/sdk-share-android- ...