ask-why 板


LINE

※ 引述《littleshan (我要加入剑道社!)》之铭言: : ※ 引述《hermitwhite (不存在的骑士)》之铭言: : : 过了几年,这次安装的是Ubuntu,安装系统时怪毛病变少了,但前 : : 述问题仍然毫不吝啬地发生。 : Windows 也有同样的问题啊 : http://en.wikipedia.org/wiki/DLL_hell 既然你把 DLL hell 这件事搬出来 我不晓得你有没有真正开发过比较大型的专案 说真的,以 DLL hell / shared library hell / jar hell 这种类型的问题 以目前的技术进展而言,还是 Microsoft 的 solution 最为完整 虽然还是无法百分之百解决所有可能的问题 但自 Windows XP SP2 之後,在普通使用者的应用上,以及一般不太刁钻的专案开发上 DLL hell 的问题发生的机会已经非常非常鲜少!! 但是,Linux 嘛...... 唉,我举一个我自己遇过很多次的实际案例: 当要开发一个 application A,它需要用到 third party library libB.so 与 libC.so 而 libB.so 与 libC.so 都会用到 libD.so 只不过,libB.so 用的是旧版 libD.so.1,libC.so 用的是新版 libD.so.2 将 library 的相依性画成下图: A ↙ ↘ libB.so libC.so ↓ ↓ libD.so.1 libD.so.2 实际 link 完毕後,application A 无法正常运作 要嘛,libD.so.2 的 symbol 会被 libD.so.1 盖掉 要嘛,libD.so.1 的 symbol 会被 libD.so.2 盖掉 (端看 link application A 时,-lB 与 -lC 这两个参数的顺序而定) 这是因为,Linux 的 runtime linker 跟本没有所谓的 symbol namespace 的概念 而这个机制,却是处理 DLL hell/shared library hell 非常关键的一环 所以,当你的程式同时用到新旧版的 shared library 时 里头的 symbol 就开始大打架 ---------- 当然,有几个参考的解法方法 第一种,就是重新 make libB.so,并 link 新版的 libD.so 不过这种方法,若 libD.so 新旧版的 API 差异太大时 重新调整 libB.so 免不了经历一场腥风血雨 如果 libB.so 本身也是个第三方大型专案的话 搞不好给你两年的时间,你都不能解决问题 更不用说如果 libB.so 是向另一家公司买来的 closed source library 这个问题就变成无解题 Linux 几个主要的 distributor,就是要耗掉很多人力 为了就是处理类似的状况 ---------- 第二种,直接对 run-time linker 开刀 使其支援 symbol namespace 的机制 然後 commit 回 Linux vanilla,造福全世界的 Linux 使用者 ---------- 第三种,也是我所采用的方式 就是自己写一个 symbol translator,把有冲突的新旧版 shared library 与用到它们的 .o 档,有冲突的 symbol 都依 shared library 版本加上 prefix 使其不再发生冲突 不过,搞到这种程度,就不要讲一般的使用者了 以 RD 而言,大概也倒掉一大半了 ---------- Java 的 jar 也有类似的问题 因为在同一个 class loader 下,class ID 是 global 的 所以不同版本的 jar 档,里头相同的 class 也会打架 不过在 Java 里头,要处理这个问题,就比较没有那麽麻烦 (但还是有点麻烦) 既然 libB.jar 用到旧版的 libD.jar libC.jar 用到新版的 libD.jar 这时,就准备两个 class loader libB.jar 里头的 class,就放在 class loader B 中 (旧版的 libD.jar 也会自动一并放入 class loader B) libC.jar 里头的 class,就放在 class loader C 中 (新版的 libD.jar 也会自动一并放入 class loader C) (比如像 Tomcat 这类的 servlet container 就是以类似的方式处理这个问题) 这时就可以避掉某些等级的 jar hell 的问题 ---------- 在 Windows 平台下,这个问题就好处理多了 只要不要用到太刁钻的状况,上述的状况都不是问题 我只能这麽说,至少,Microsoft 在这个问题上面,有真真正正下过苦功处理 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.32.58.129 ※ 编辑: mgtsai 来自: 114.32.58.129 (01/22 22:17)
1F:推 micklin:推, 但是离题了 = = 01/22 23:03
2F:推 H45:推一个 01/23 03:10
3F:推 littleshan:这问题可以用 soname + default symver 来解决 01/23 17:59
4F:→ littleshan:同一个symbol的不同version是可以共存的 01/23 18:00
5F:推 StAnger:这篇太专业了 我只看的懂一点点 XD 01/25 23:40







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP