您尚未登录。

#1 2021-01-29 23:35:17

renyuneyun
会员
所在地: 地球
注册时间: 2011-09-30
帖子: 132
个人网站

一个软件A依赖某旧版本其他库B,如何将B打包进A且避免产生文件冲突?

嗯,作为一个长期arch用户,我知道最好是能用新版本的就用新版本的,但实在找不到替代软件了。
故事是这样的:有一个软件musly,它依赖libav 0.8版本。而arch标准情况下用的是ffmpeg,它和libav两者有点历史渊源/冲突,于是ffmpeg里面包含了libav的相关内容(比如头文件)。然而官方仓库中的ffmpeg的版本和libav 0.8不相兼容(废话),且由于文件冲突又不能专门装个libav 0.8到系统中(这也是为什么AUR上有libav-no-libs但没有libav)。
我在docker容器中测试了一下,libav 0.8和musly都可以正常编译和运行。于是现在的问题就是如何将它带到系统中——我本身计划的是基于musly(或libmusly)开发一个播放器包装/播放列表前台,所以放在容器中是很奇怪的做法。

所以我想到也许可以静态链接——将libav 0.8的相关部分静态链接到libmusly中,这样就不需要考虑libav的冲突问题了。但我对此没有什么经验,所以希望可以得到一些建议——包括/尤其是这样是否可行。

其中libav通过autotools(./configure)(及make)进行编译,而musly通过cmake进行编译。不知道这两者会否影响复杂性之类的。我从来没编写过autotools的配置,对cmake也只有很简单的经验。


知識很重要,而相當的運用能力更重要。

离线

#2 2021-01-30 02:04:16

twobooks
会员
所在地: rainforest
注册时间: 2020-05-19
帖子: 84

Re: 一个软件A依赖某旧版本其他库B,如何将B打包进A且避免产生文件冲突?

当我发现Java有些鸡肋的时候, 不想安装在系统里, 只把需要的版本解压到自定义的目录下, 然后在PATH里指向这个目录 PATH=/usr/local/pgsql/bin:/usr/local/jre1.8.0_251/bin, 这样只在启动eclipse时才会用到Java, 如果是库文件可以定义LD_LIBRARY_PATH=/usr/local/pgsql/lib, 不知到是不是适合你的这种情况。

最近编辑记录 twobooks (2021-01-30 02:09:45)

离线

#3 2021-01-30 10:30:00

yw662
大会员
所在地: localhost
注册时间: 2018-10-10
帖子: 424

Re: 一个软件A依赖某旧版本其他库B,如何将B打包进A且避免产生文件冲突?

我先来,用docker或containerd或cri-o或什么的,依赖版本的最终解决方案(迫真

啊你不能这么做啊。。。。


Musly说自己是music similarity库,你开发播放列表为啥要用到它

最近编辑记录 yw662 (2021-01-30 10:38:13)


ecmascript是世界上最好的语言

离线

#4 2021-01-30 12:51:02

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,821
个人网站

Re: 一个软件A依赖某旧版本其他库B,如何将B打包进A且避免产生文件冲突?

你可以把这个旧版本放到A的某个目录中,并且在启动时设置LD_LIBRARY_PATH以便它可以找到库文件。

更好的办法是像那堆 lua 那样,把头文件放到带版本号的子目录中,库文件因为 soname 不同的原因应该不需要动?

离线

页脚