软件自带依赖库还是共享对象库/为什么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并发编程的艺术> 第一章 介绍 线程的优势:充分利 ...
随机推荐
- Hadoop记录-HDFS均衡脚本
#!/bin/bash #作用:hdfs使用率取最大100个主机和最小80个主机进行数据均衡 #打印报告 hdfs dfsadmin -report>report.txt #截取主机名 cat ...
- word封面背景及水印背景
word封面背景及水印背景 觉得有用的话,欢迎一起讨论相互学习~Follow Me 制作封面 在制作商业项目申报书的时候我们想要封面尽可能美观,常用的方法是使用插入一张很大的图片作为背景. 标题等文本 ...
- Python和Pygame游戏开发 pdf
Python和Pygame游戏开发 目录 第1章 安装Python和Pygame 11.1 预备知识 11.2 下载和安装Python 11.3 Windows下的安装说明 11.4 Mac OS X ...
- 通过pathinfo返回扩展名
strtolower(pathinfo(abs.php,PATHINFO_EXTENSION)); 小写 通过pathinfo返回扩展名 pathinfo() 函数以数组的形式返回文件路径的信息. p ...
- Activiti之act_ge_property表引发的坑(dbSchemaUpdate)
Activiti之act_ge_property表引发的坑(dbSchemaUpdate) 参考文档: https://blog.csdn.net/lb19921223/article/details ...
- 【JS新手教程】replace替换一个字符串中所有的某单词
JS中的replace方法可以替换一个字符串中的单词.语句的格式是: 需要改的字符串.replace(字符串或正则表达式,替换成的字符串) 如果第一个参数用字符串,默认是找到该字符串中的第一个匹配的字 ...
- VUE中事件修饰符:stop prevent self capture
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- BASH输出着色显示
通过将其输出着色,可以使BASH脚本更漂亮.使用ANSI转义序列设置文本属性,例如前景色和背景色. 使用以下模板格式来编写彩色文本: echo -e "\e[前景色值;背景色值;2m文本\e ...
- python 爬虫实例(一)
一个简单的爬虫工程 环境: OS:Window10 python:3.7 安装一些库文件 pip install requests pip install beautifulsoup4 pip ins ...
- maven基础和基本使用
maven介绍 Maven是基于项目对象模型(POM project object model)实现的,可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具. 具体作用: 项目 ...