Linux系统是怎么处理依赖冲突的?
Tofloor
poster avatar
北冥夜未央
deepin
Ecological co-builder
2020-11-16 06:30
Author

Windows系统下.dll是先加载本地的,如果本地找不到才到环境变量中寻找,有效的避免的.dll文件版本冲突问题。

而Linux系统是直接在环境变量中寻找.so文件,如果程序所在目录没有放到环境变量中,系统不会加载,那么如果一个系统中各软件的依赖版本如果不一样该怎么处理?

举个例子:

假如Linux系统内置的Qt版本是5.5的,系统组件也是用5.5版本编译的;现在A软件是5.0版Qt编译的,运行需要5.0版的.so文件;B软件是5.7版本的Qt编译的,运行需要5.7版的.so文件。如果把5.0、5.5、5.7版的.so文件路径都放到环境变量中,势必会造成依赖冲突。那么Linux系统是怎么协调各个版本的软件准确的找到自己需要的.so文件的?

Reply Favorite View the author
All Replies
SamLukeYes
deepin
2020-11-16 06:54
#1

有些软件使用系统的库版本,那就需要根据不同的发行版分别编译;有些软件自带了一些依赖库,就会在启动脚本中为自己设置环境变量,优先找自带的库

Reply View the author
Feng Yu
deepin
2020-11-16 07:08
#2

不解决依赖冲突。所以任何依赖冲突都会直接出错退出,让用户自己想办法去

Reply View the author
北冥夜未央
deepin
Ecological co-builder
2020-11-16 07:23
#3
SamLukeYes

有些软件使用系统的库版本,那就需要根据不同的发行版分别编译;有些软件自带了一些依赖库,就会在启动脚本中为自己设置环境变量,优先找自带的库

原来启动脚本还可以控制这个,学习了[威武]

想尝试学下打包,发现依赖冲突很严重,找到依赖,换个系统就启动不了了。。。

Reply View the author
北冥夜未央
deepin
Ecological co-builder
2020-11-16 07:25
#4
Feng Yu

不解决依赖冲突。所以任何依赖冲突都会直接出错退出,让用户自己想办法去

这种包估计别人打包好了就是为了方便自己用的,没准备发布。

Reply View the author
Feng Yu
deepin
2020-11-16 07:32
#5
北冥夜未央

这种包估计别人打包好了就是为了方便自己用的,没准备发布。

自己解决也不难,为了避免和系统依赖冲突,自己设置一个LD_LIBRARY_PATH环境变量就行了,冒号分割多个路径,如: 

LD_LIBRARY_PATH="/path/to/lib:/usr/lib/:/usr/lib64/:${LD_LIBRARY_PATH}" /path/to/execution

环境变量设置和执行命令放同一行执行,可以临时只对这一条命令生效,执行完毕环境环境变量就被还原,不干扰其他程序。


如果期望自己引入系统级别依赖,又不会和系统软件包冲突,也可以把自己的路径添加到/etc/ld.so.conf.d/*.conf文件也行,比如:

echo '/usr/local/lib' | sudo tee -a /etc/ld.so.conf.d/local.conf

sudo ldconfig


这样所有的软件都会额外在/usr/local/lib/路径下去找依赖,你可以把自己编译的依赖扔到/usr/local/lib(/usr/local通常也是configure的默认路径),不过这样有一定的危险性,改动系统目录和系统配置对系统都会有一定破坏作用,你必须自己确保你引入的依赖可以兼容其他程序,好处就是不需要自己设置环境变量,所有程序都受益,而且不会和其他deb包冲突

Reply View the author
北冥夜未央
deepin
Ecological co-builder
2020-11-16 07:48
#6
Feng Yu

自己解决也不难,为了避免和系统依赖冲突,自己设置一个LD_LIBRARY_PATH环境变量就行了,冒号分割多个路径,如: 

LD_LIBRARY_PATH="/path/to/lib:/usr/lib/:/usr/lib64/:${LD_LIBRARY_PATH}" /path/to/execution

环境变量设置和执行命令放同一行执行,可以临时只对这一条命令生效,执行完毕环境环境变量就被还原,不干扰其他程序。


如果期望自己引入系统级别依赖,又不会和系统软件包冲突,也可以把自己的路径添加到/etc/ld.so.conf.d/*.conf文件也行,比如:

echo '/usr/local/lib' | sudo tee -a /etc/ld.so.conf.d/local.conf

sudo ldconfig


这样所有的软件都会额外在/usr/local/lib/路径下去找依赖,你可以把自己编译的依赖扔到/usr/local/lib(/usr/local通常也是configure的默认路径),不过这样有一定的危险性,改动系统目录和系统配置对系统都会有一定破坏作用,你必须自己确保你引入的依赖可以兼容其他程序,好处就是不需要自己设置环境变量,所有程序都受益,而且不会和其他deb包冲突

自己设置LD_LIBRARY_PATH临时用于一个程序这个方法看着不错。

/etc/ld.so.conf.d/写.conf文件的效果好像和/etc/profile里写环境变量差不多,还只能写.so文件的路径。

Reply View the author
mcaoser
deepin
2020-11-16 07:49
#7

苹果系统下的软件为什么都非常大,就是因为大多应用都自己包含了几乎所有的依赖。linux或mac(类unix)与windows在这方面的机制不同,所以windows在使用久了后,windows目录会变得很大,很多应用程序直接将一些库文件放到里面去了,两种机制各有利弊。windows安装软件简单,linux安装软件麻烦,但卸载后系统较干净。

Reply View the author
北冥夜未央
deepin
Ecological co-builder
2020-11-16 07:52
#8
mcaoser

苹果系统下的软件为什么都非常大,就是因为大多应用都自己包含了几乎所有的依赖。linux或mac(类unix)与windows在这方面的机制不同,所以windows在使用久了后,windows目录会变得很大,很多应用程序直接将一些库文件放到里面去了,两种机制各有利弊。windows安装软件简单,linux安装软件麻烦,但卸载后系统较干净。

是这个道理,所以windows只适合桌面端。微软的服务器都是用的linux系统[坏笑]

Reply View the author
wcs4221
deepin
2020-11-16 14:49
#9

很好的问题。

Reply View the author
sgb76
deepin
2020-11-16 22:53
#10

linux下的appimage包与mac下的dmg包感觉类似,都是把所有软件的依赖扔进包里

Reply View the author
cuisanzhang
deepin
2021-09-28 22:04
#11
sgb76

linux下的appimage包与mac下的dmg包感觉类似,都是把所有软件的依赖扔进包里

为什么应用商店的应用不都打包为appimage呢

Reply View the author
北冥夜未央
deepin
Ecological co-builder
2021-09-29 20:12
#12
cuisanzhang

为什么应用商店的应用不都打包为appimage呢

常规打包软件100M,打包appimage估计就得300M以上了。

Reply View the author
cuisanzhang
deepin
2021-10-01 00:07
#13
北冥夜未央

常规打包软件100M,打包appimage估计就得300M以上了。

但是就没有依赖关系了啊,我觉得依赖这个问题非常麻烦, 软件依赖库, 库最后依赖libc,libc又依赖内核, 内核天天更新, 这又是内核的问题, 天天升级,我超

Reply View the author