V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cxshun
V2EX  ›  程序员

再吐槽 linux 的版本依赖

  •  
  •   cxshun ·
    cxshun · 2015-06-24 14:53:28 +08:00 · 13615 次点击
    这是一个创建于 3443 天前的主题,其中的信息可能已经有所发展或是发生改变。
    今天早上,由于维护docker环境 ,要安装一个叫Image magick的图片处理工具,这家伙最新版本为6.9.1-6,在安装它之前需要先装delegates,即类似的第三方处理工具,由它去处理png,jpeg等等的啥东西。
    就是这一堆东西: http://www.imagemagick.org/download/delegates/

    在这个Image magick上花了接近大半天的时间,主要是configure时死活认不出libpng,但实际上已经装完了。
    后来实在没办法,硬是换回了旧版本6.9.1-1完事。

    有时候,我会想,这些源代码编译软件的存在,就是为了折磨我们吗?这版本依赖的存在,相比windows和mac的一个包搞定的,简直是坑爹得不行。

    遇到这样一种源代码安装,并且版本依赖非常强的软件,你们的看法是怎样的?

    PS:曾经遇到过一个需要源码编译的软件,它依赖的软件,相关0.0.1都编不过,从那个时候开始,遇到需要编译安装的软件,我就觉得好日子好像又到头了。
    PS2:不要说apt-get和yum哈,那两个家伙确实不错,但问题是很多源代码安装的软件不在那里面啊。
    第 1 条附言  ·  2015-06-25 14:21:48 +08:00
    经过各位V友的指正,我用源代码跟windows下的msi或mac下面的pkg或app比较是不对的,两个是完全不同的东西,确实,应该用apt、yum等包管理进行比较。多谢各位的指定。

    看回复,好多人都推荐用包管理,看来用源代码安装确实是一个不便的做法,以后也会尽量避免,毕竟有可能会遇到一些依赖性的问题,花费大量的时候也不划算。
    104 条回复    2015-11-29 03:22:54 +08:00
    1  2  
    Kabie
        1
    Kabie  
       2015-06-24 14:57:23 +08:00
    pacman aur
    Kabie
        2
    Kabie  
       2015-06-24 14:58:15 +08:00   ❤️ 1
    自从用了Arch。。。再也不用担心安装从源码编译的软件了。。。
    EPr2hh6LADQWqRVH
        3
    EPr2hh6LADQWqRVH  
       2015-06-24 15:00:36 +08:00
    非也非也。。
    吐槽姿势不对,乱吐一气。。
    lingo233
        4
    lingo233  
       2015-06-24 15:00:51 +08:00 via iPhone
    我就知道会有人安利arch,虽然我也用>_<
    linhua
        5
    linhua  
       2015-06-24 15:04:26 +08:00
    lichao
        6
    lichao  
       2015-06-24 15:07:37 +08:00
    “但问题是很多源代码安装的软件不在那里面啊”,

    但是 Image magick 明明就在那里面啊!!
    Tiande
        7
    Tiande  
       2015-06-24 15:08:00 +08:00   ❤️ 1
    @lingo233
    @linhua
    @Kabie

    Debian 用户表示静静地看你们歪楼 )
    ivenvd
        8
    ivenvd  
       2015-06-24 15:10:38 +08:00
    自从用了 Arch,基本上没手动运行过 ./configure 了。
    cxshun
        9
    cxshun  
    OP
       2015-06-24 15:11:33 +08:00
    @lichao 好吧,其实是我自己做死。这个例子举得不大对。总有些没在apt-get和yum里面的。
    @Kabie
    @lingo233
    @linhua Arch很赞,好吧,我承认我只在虚拟机里面安装过。
    @avastms 好吧,囧,我换个姿势来一下。
    @dtdnqsb 你错了,兄弟,我的docker就是Debian哈。
    Tiande
        10
    Tiande  
       2015-06-24 15:19:18 +08:00
    我觉得是因为 linux 用户的 cpu 架构等等更乱而杂,编译安装普世性更高。

    如果全世界的机器配置都一样 ,就不会出现楼主你讨厌的问题了。

    歪楼是指,评论正演变成 发行版 之战。hh
    Havee
        11
    Havee  
       2015-06-24 15:21:11 +08:00
    source distribution,有 BSD 的 ports,有 Gentoo 的 portage,人家都帮你处理好了依赖关系,犯不着自己去处理。

    至于 binary distribution,确实没有很好的多版本共存包管理器,不过 Archlinux 的 abs 系统还是不错的,譬如衍生出的 aur,pkgbuild 脚本自己编辑编辑,无非就是 configure、instal 路径罢了。

    个人观点,犯不着去自己编译,要自己编译的教程都是流氓,除非背后有一个团队在维护着,要信任发行版的包管理器。
    Havee
        12
    Havee  
       2015-06-24 15:22:13 +08:00
    就算源里没有,也应该至少打包一下,而不是粗暴的 make install
    timi
        13
    timi  
       2015-06-24 15:24:01 +08:00
    解决的方案是:能在windwos上完成的工作就在windows上完成。
    FrankFang128
        14
    FrankFang128  
       2015-06-24 15:26:01 +08:00
    看看 Mac OS X,冗余打包,多好。
    neoblackcap
        15
    neoblackcap  
       2015-06-24 15:26:45 +08:00
    @cxshun 源代码是给你改的,不是为了分发的。
    neoblackcap
        16
    neoblackcap  
       2015-06-24 15:29:36 +08:00
    @Havee 楼主在docker里面搞,这就算了,反正按照docker的规范,一个容器就一个进程而已,犯不着打包之类的,若是有问题就干掉容器重来就好了
    zsj950618
        17
    zsj950618  
       2015-06-24 15:30:58 +08:00   ❤️ 1
    > 主要是configure时死活认不出libpng,但实际上已经装完了。

    你只是 autoconf 玩不转而已,又何必扯到 linux 版本依赖。
    cxshun
        18
    cxshun  
    OP
       2015-06-24 15:34:25 +08:00
    @neoblackcap 问题是别人没有deb包啊,我怎么办。apt-get的版本又不对。
    @Havee 好吧,有些团队就是这么坑爹啊。
    @FrankFang128 是啊,虽然包大一点,但起码不会这么麻烦。
    @timi 现在越来越同意这个了。或者在mac上,linux就做服务器用用就好了。
    @dtdnqsb 哦,这样啊,按现在情况暂时还不会哈。其实最主要的问题还是linux太分裂了。
    Septembers
        19
    Septembers  
       2015-06-24 15:39:29 +08:00 via Android
    @zsj950618 最蛋疼的不是版本依赖而是版本锁定
    Septembers
        20
    Septembers  
       2015-06-24 15:40:33 +08:00 via Android
    @zsj950618 依赖锁死 就真的很蛋疼了
    likuku
        21
    likuku  
       2015-06-24 15:43:53 +08:00
    包管理器,别逗了... linux 各个发行版,基本系统和“业务应用” 都是一锅大乱炖...

    可能会出现以下吐血场面:
    1. 业务应用 的某依赖涉及基本系统某软件包,没办法只有顺带更新,引发连锁反应,基本系统都死掉。
    2. 基本系统 某安全更新,影响到某些业务软件包,安全更新必须要,业务系统又不能关停/新旧版本冲突,结果业务系统挂掉。
    szopen
        22
    szopen  
       2015-06-24 15:45:02 +08:00
    你不会用pkg-config而已
    cxshun
        23
    cxshun  
    OP
       2015-06-24 15:45:03 +08:00
    @zsj950618 难道我就下个源代码安装个软件还要改下它的编译文件,我不搞linux开发,不在上面写c,所以我不懂autoconf,我只知道make make install和configure。你可以说我不懂,这是事实。但要搞清楚,为什么一个软件不能好好地做好,而要依赖特定的版本。所以我才说mac和windows整个打包的方式好一点,没有太多依赖的问题,反正都在一起了。
    @Septembers 是啊,要是哪一个so后面加个版本,就只能坑爹了。
    neoblackcap
        24
    neoblackcap  
       2015-06-24 15:49:31 +08:00
    @cxshun 其实这样的情况本身就应该是身为开发人员你自己解决的事情,你说你是运维的话,那一样是你的事情,是你的责任。

    面对责任,那没什么好说的,你其实用点心google一下,用ubuntu就找下ppa那就可以了。其实linux世界都向二进制分发迈进中,很多软件还是有人去做每夜构建版本的,你自己找找就好了。
    zsj950618
        25
    zsj950618  
       2015-06-24 15:52:07 +08:00
    @cxshun 你在用autoconf来编译软件,然后你说你不会,哦,好吧,就这样吧。
    chilaoqi
        26
    chilaoqi  
       2015-06-24 15:57:43 +08:00
    Linux 存在的意义就是折腾。
    mongodb
        27
    mongodb  
       2015-06-24 15:58:42 +08:00
    @likuku 所以redhat为老版本还一直提供各种安全更新其实好像挺良心——升级吧各种问题,不升级吧又有已知漏洞。然后redhat过来拍肩,别怕,老大帮你补漏洞。
    Septembers
        28
    Septembers  
       2015-06-24 15:59:58 +08:00
    @neoblackcap
    二进制分发 的问题是 二进制与CPU指令集不是最优匹配
    (然而这个问题只有自己编译能解决
    (然而一般情况而言很难遇到这个问题
    cxshun
        30
    cxshun  
    OP
       2015-06-24 16:15:41 +08:00
    @zsj950618 好吧,我只是不懂里面的语法罢了。我会写简单的Make文件,但不意味着我要去维护它,所以才有后面的感慨。
    @mongodb redhat确实良心。
    @neoblackcap 我知道apt-get里面有,但这货就是没有最新的在apt里面。责任不可避免,我承认。但每个需要编译的都要这样去解决是很耗时的。运维花点时间还好,但作为开发人员花时间去处理环境问题,感觉比较繁琐。

    用心点google,我遇到这些编译问题当然每一时间google啦,但问题是没人可以解决。而且我换了一个版本就解决了(可以识别到libpng),你告诉我这是我的问题?
    @fu82581983 兄弟,我会安装。而且我已经装好。我这里吐槽的是版本依赖的东西哈。
    icemanpro
        31
    icemanpro  
       2015-06-24 16:17:59 +08:00
    opensu
        32
    opensu  
       2015-06-24 16:26:24 +08:00
    @Kabie 为什么呢?小白,没有用过arch
    linux40
        33
    linux40  
       2015-06-24 16:29:50 +08:00
    arch大法好
    giskard
        34
    giskard  
       2015-06-24 16:50:06 +08:00
    借楼请教一下大家,这样的问题如何才能比较好的解决:
    服务器,centos 5.x 不能连外网,没有root权限,想要在自己目录下编译一个库A,./config以后告知缺少库B和C,于是去下了B和C的源码,./config一下,被告知缺少库D和E......

    请问我该怎么办?
    Septembers
        35
    Septembers  
       2015-06-24 16:57:29 +08:00 via Android   ❤️ 1
    @giskard 自己本地搭建好相同的发型版的环境,进行编译打包封装成rpm 再发布到部署
    holyzhou
        36
    holyzhou  
       2015-06-24 17:01:22 +08:00
    @szopen 对头 应该是编译没指定Image magick需要的新版本的libpng的pc的文件 都还在默认路径找
    choury
        37
    choury  
       2015-06-24 17:06:12 +08:00
    在debian下,如果你要编译需要装dev包,比如libpng12-dev 这种
    holyzhou
        38
    holyzhou  
       2015-06-24 17:10:21 +08:00   ❤️ 1
    @giskard 依赖问题还是要解决的,找个相同版本跟架构的机器用yum或者apt这种包管理方式补齐缺的库一般都是 *-devel形式的 ,debian的是lib开头的,包管理找不到就编译 ,最后直接把生成的二进制传上去用就好。
    vibbow
        39
    vibbow  
       2015-06-24 17:10:50 +08:00
    @icemanpro winsxs不就是用来解决这个问题的么?
    giskard
        40
    giskard  
       2015-06-24 17:13:53 +08:00
    @holyzhou 谢谢,你的意思是把所有缺少的库以及我要安装的 A 都在本地机器编译好,然后传到服务器上,是这样吗?我去试试
    giskard
        41
    giskard  
       2015-06-24 17:16:01 +08:00
    @Septembers 谢谢,这种方法之前在搜索的时候见到过,但是还没尝试。请问一下您用什么工具来讲本地编译好的打包成rpm,还有一个问题,打包成rpm的话,去服务器上安装rpm包还是要root权限,是吗?那我没有root权限是不是没法安装rpm包啊?
    neoblackcap
        42
    neoblackcap  
       2015-06-24 17:16:09 +08:00
    @cxshun 软件都有bug,你我都清楚,指导不友好在开源的项目中很普遍。

    回到你的问题,你问面对版本依赖强的软件该怎么做,我告诉你的方法就是逃,你自己就是这样,或者这才是正确的解决方法,是你自己强迫自己而已。你换个版本就可以了,那就说明你其实不依赖特定的版本。你又不依赖特定的版本,那何苦辛苦自己去编译这个难啃的骨头?

    你为何一定要编译?我的意思是二进制分发的软件这么多途径,你为何一定要依赖apt的官方源呢,apt没有你就要找源码编译?为何不试试找新的二进制源添加进apt呢?
    holyzhou
        43
    holyzhou  
       2015-06-24 17:19:03 +08:00
    @giskard 对的
    holyzhou
        44
    holyzhou  
       2015-06-24 17:26:49 +08:00
    @neoblackcap 哈哈 立马想到以前教linux老师问另一个大神老师 ,你干嘛自己编译kernel ,直接yum装装好嘞,他回答:"because i can."。 我觉得日常不是冲着研究去的,真的就是包管理装装好了,省心省事省力
    FifiLyu
        45
    FifiLyu  
       2015-06-24 17:30:38 +08:00
    其实自己会写C,编译出现的各种奇葩问题都能解决。公司的CentOS5要用各种最新版本的包,找不到rpm,就自己搞。

    虽然,我能编译。
    但是,好累。
    所以,我用Arch。

    2333
    lilydjwg
        46
    lilydjwg  
       2015-06-24 17:38:52 +08:00
    在 Linux 下你也可以一个命令搞定。ImageMagick 这么出名的软件大部分发行版都会有包的。

    **请不要拿 Linux + 源码编译 和 Windows + 预编译包 对比!**不然你说世界举重冠军算什么,去蓝翔学学超重机就好了嘛。

    你可以试试在 Windows 下源码编译 ImageMagick,看看到底谁更坑。

    当然 Mac OS X 有 Homebrew 很强大,但 Gentoo 也有 emerge 呀。Arch 还有 abs 呢。Windows 呢?有什么?
    josephok
        47
    josephok  
       2015-06-24 17:39:42 +08:00
    尽量用包管理器吧
    lilydjwg
        48
    lilydjwg  
       2015-06-24 17:41:14 +08:00   ❤️ 1
    @holyzhou 我也自己编译内核,因为我的内核可以在文本界面显示中文!可以合并相同内存页!有调试符号、支持 systemtap!支持 bfq I/O 调度器! :-)
    cxshun
        49
    cxshun  
    OP
       2015-06-24 17:47:47 +08:00
    @szopen 这个还真没用过,我去瞧瞧。
    @holyzhou 主要还是想省心,每个软件这样搞,真心太累了。
    @neoblackcap 确实,但如果不试其他版本的话,我真不知道是版本的问题。
    主要的问题就是在这里,怎么去确定是版本的问题,而不是自己安装的问题。因为它说找不到libpng,我还真怀疑自己安装有问题,找了好多个版本,但都不行,而网上没人遇到同样的问题。或者说,之前的版本都没问题,只是最近的才有。

    其实很多时候,我们更倾向于怀疑自己做错了,而不是软件的问题,所以会花费很多时间。我吐槽也是想大家讨论下,有什么办法能够去减少花费在这些上面的时间,因为真的很费时,但又没啥用。
    @lilydjwg windows包管理确实没linux和mac好,但windows的msi很强大,也很好。
    @giskard 没网络用linux确实是很烦心的,因为很多依赖你需要从网上获取。
    @icemanpro 太老的windows吧,现在的貌似没听说。
    @choury 哦,原来这样啊,学习了。
    lilydjwg
        50
    lilydjwg  
       2015-06-24 17:57:19 +08:00
    @cxshun 库依赖检测不到的话去看看 config.log?
    zhengkai
        51
    zhengkai  
       2015-06-24 17:58:38 +08:00
    我当年编一个 php 编了整整一天我会到处乱说?
    从升级 gcc glibc 开始,所有依赖全部 wget configure make,用现在的话来说,那酸爽……

    很久以后我才知道 centos 里对应 apt-get 的叫 yum
    又过了很久我才知道依赖库大部分用 libxxx-dev 就可以了,不用自己编……
    likuku
        52
    likuku  
       2015-06-24 18:07:48 +08:00
    更欣赏 freebsd 的作法,基础系统的独立出来,现在有 freebsd-update 来自动安全搞定2进制更新基本系统和内核。第三方/非BSD授权/各种应用软件,就都交给 自动源码编译的 ports/pkg bin,etc,src包,统统放在 /usr/local 下,不会去染指 基本系统,所需的所有依赖/与基本系统不兼容的依赖,也都放在 /usr/local

    最大程度地保证了基本系统的干净可用。
    mathgl
        53
    mathgl  
       2015-06-24 18:18:43 +08:00
    @zhengkai 曾经花过好几天的时间 built qt from source...
    proudzhu
        54
    proudzhu  
       2015-06-24 18:22:36 +08:00
    @likuku 安装到 /usr/local 只要在 configure 的时候指定就行了,不过窃以为放到哪不重要,有包管理器管理就行
    neoblackcap
        55
    neoblackcap  
       2015-06-24 18:25:51 +08:00
    @cxshun 为什么一定知道原因?你就是要一个能跑的就行了,反正你就换,选成本最低的来,比如有二进制下载,那赶紧去下载,不要管是不是你编译参数调对没调对,因为你下载速度肯定比你编译的速度快。
    likuku
        56
    likuku  
       2015-06-24 18:26:30 +08:00
    @proudzhu 安装到哪不重要,包管理器也不重要,只要能和基本系统隔离就行

    ports 虽然是自动源码编译(gentoo 的 emerge 就源自 ports),安装后会在 pkg 的 包管理器里注册(含依赖关系),之后删除和查看信息也都可以直接用 pkg 这个2进制包管理器操作。
    stevegy
        57
    stevegy  
       2015-06-24 19:19:41 +08:00
    看半天,你原来的错误消息到底是啥?报特定版本的libpng没找到?还是别的?
    jarlyyn
        58
    jarlyyn  
       2015-06-24 20:57:08 +08:00
    debian用户路过。
    Linusyeung
        59
    Linusyeung  
       2015-06-24 21:10:56 +08:00 via iPhone
    其实楼主提的是个好问题嘛!大家不要不耐烦。。。

    好产品,终归要以用户体验和需求为本。

    Linux 就是 Geeks 的玩具,别太较真。乐趣就是折腾。

    用 arch 飘过。
    cbsw
        60
    cbsw  
       2015-06-24 23:08:36 +08:00   ❤️ 1
    @cxshun 你以为软件作者想只依赖某个特定版本啊?使用别人的东西,别人升级后改动了 API,如果有精力可以天天跟在屁股后面升级兼容。作为一个开发人员,这点相信你是知道的,现在的开发必定是建立在很多已有库、软件基础之上的

    自己编译只是用来满足特定的需求,没有特别的需求的直接用包管理器拖一个二进制回来,省心又省力。当年玩 Gentoo 每周升级一次,遇到 DE、LibreOffice、Chromium、Firefox、GHC、GCC 之类需要升级的笔记本会哭一整天、呼呼地报怨,而当时还傻傻地以为她是接到任务,满心欢喜地卖弄着给我干活呢。所以节约能源,请善待你的电脑,不要让她哭泣

    现在软件开发趋势是开发时使用各种依赖,生成的最终软件将依赖一起打包,毕竟现在硬盘和带宽足以支持大文件传输与存储。
    最近新出的语言(Go、Rust等)默认都是静态编译,所以依赖问题会大大减少;但是开发过程中仍然不可避免地要与各种依赖干架,这个是与平台无关的,而且相对来说 Linux 在这方面要比 Win/Mac 容易处理

    @lilydjwg 小狐狸,我以前用过 Gentoo 一段时间,编译过好多次内核,尝试多次都没能在 console 界面显示中文,你编译几次成功的?

    那些安利 debian 的,你们用的有几个软件是原作者最初的版本,deb 自行打各种 patch,随意篡改软件的结构,配置文件也是各种分割又篡改,出了问题可能软件原作者都不一定能帮你

    centos/rhel 跑些比较老的应用还是不错的,但是源里面的东西少而且老,一旦需要 DIY 源里没有的东西就是噩梦的开始,真的是牵一发而动全身,因为你已经落后时代好久了,所以必需非常非常非常小心翼翼地,稍不注意可能就弄坏了系统的某个组件,而要修复那个组件很可能造成更大的破坏

    没错,我是来安利 ArchLinux 的
    Arch 作为一个为 686 优化的发行版,在现在绝大多数机器上跑得特别欢畅,pacman 是 C 写的,比 Gentoo 的 protage 快了n多倍,也比 apt/yum/zypper 之流快好多,Wiki 也是 Linux 界数一数二的,有时在 Fedora/Ubuntu/Debian 等发行版中遇到问题我也习惯先到 Arch Wiki 中查找,而且很多时候都可以找到好的解决方案,这个要比 Google 到 StackOverflow 众多答案中去试要高效得多。pacman 和 abs 两套系统让 Arch 支持二进制和源码两种方式,而且比较和谐,当然还有数量庞大的 aur,想到的没想到的在里面几乎都有,不过由于不是官方维护,质量也参差不齐,编译成功率比 Gentoo portage 低了一两个量级,所以如果真的要玩编译还是推荐 Gentoo。
    另外使用 ArchLinux 可以第一时间尝到软件最新版本,当然这从某个方面来说这是很好的事情,但是好多时候新特性用上了,自己都会吓一跳,并不是说经常碰到bug,而是说对于新特性还没有作好心理准备就突然出现在你的系统里了,事实上用了这么多年 Linux,尝试过各种发行版,ArchLinux 中我遇到的 bug 最少,遇到问题也基本上是最快可以解决的


    另外软件、库多版本共存并没有什么问题,现在已有成熟可用的 NixOS,同时 GNU 也正在构建一套这样的发行版 GuixSD,期待以后能用 Scheme 配置我的系统

    NixOS: http://nixos.org
    Guix: http://www.gnu.org/software/guix
    cattyhouse
        61
    cattyhouse  
       2015-06-24 23:18:49 +08:00 via iPhone
    如果你需要编译的软件比较多,直接gentoo,省心
    southwolf
        62
    southwolf  
       2015-06-24 23:26:34 +08:00
    233 最近给 Ubuntu 15.04 升级了 4.0 内核(笔记本嘛,总有些诡异的驱动,内核肯定越新越好) ,然后要装 Docker, 然后 Docker 依赖 linux-image-virtual, 然后 linux-image-virtual 依赖 kernel 3.19......
    monnand
        63
    monnand  
       2015-06-24 23:27:14 +08:00
    你为什么要自己编译代码啊……你需要修改这个程序吗?你需要给这个项目做贡献吗?如果不需要,为什么不直接用源里现成的?如果闲版本地,为什么不直接下载.deb, .rpm的二进制包?
    lilydjwg
        64
    lilydjwg  
       2015-06-24 23:27:38 +08:00
    @cbsw 我最开始是手工编译安装的,参见 http://lilydjwg.is-programmer.com/posts/21162.html
    后来是修改 PKGBUILD 的,参见 https://github.com/archlinuxcn/repo/tree/master/linux-lily

    修改是基于发行版的内核配置的,所以成功率很高。不过很难自动化,所以版本会比较旧。不过正因为如此,我逃过了两次文件系统损坏的 bug =w=

    Arch Linux 的确新鲜又原汁原味,偶尔大版本更新比如 systemd 的引入等需要一定时间来习惯,颇为费神。不过我现在已经喜欢上 systemd 啦。另外就是经常受新引入 bug 的影响,其中大部分会很快被修复,少数得慢慢等上游解决所以只好先降级用。

    我发现在各软件上游,Arch Linux 的出镜率挺高的,经常上游一改坏什么东西,马上就被 Archer 发觉了~

    其实我早不用 abs 了。把官方两个源的 PKGBUILD git 仓库 clone 了回来,方便好用 :-)
    nikoukou
        65
    nikoukou  
       2015-06-24 23:37:57 +08:00
    arch要是保证滚不挂,收费我也用。。。
    lirau
        66
    lirau  
       2015-06-24 23:38:44 +08:00
    从非技术角度安慰下你吧,如果你掌握了,就是你比别人强的技能点。。
    LeoQ
        67
    LeoQ  
       2015-06-24 23:39:43 +08:00 via Android
    我以前最开始用linux的时候想安视频播放器 于是去mplayer官方网站下了源码,经百度知道要./configure make , make install
    然后一路下去,make了上十分钟,但是什么文件也不能顺利打开,后来我发现config的时候有些地方不OK,我就一个个的谷歌,安装,再后来,我就悟到了,最主要的就是要安装gcc, g++ 各种视频格式的dev包,alsa的dev包,然后再编译,安装,就可以了。


    当然现在说起来很轻松,当时就为了简单的看个视频,我钻研了好几周,但是不得不说,我觉得这段经历还是很有价值的,至少我知道了依赖是什么。
    cbsw
        68
    cbsw  
       2015-06-25 00:00:37 +08:00
    @nikoukou 无脑升级,任何系统都可能会挂掉,那些安装微软更新的出问题不照样一大堆吗。那些可能会导致系统挂掉的升级,pacman 前都会询问你是否覆盖或强制更新,没搞明白你就随手输个 y,挂掉了能怪谁。出现这种不兼容的升级并不是三天两头,可能一年也就碰到一两次而已,去官网瞅一眼看看指导基本不会出任何问题
    @lilydjwg 原来还有一个 archlinuxcn 仓库啊,用了这么久 arch 我竟然不知道,汗颜啊。回头试试
    pubby
        69
    pubby  
       2015-06-25 01:34:11 +08:00 via Android
    @likuku 开个jail,搞定业务需要的运行环境。碰到软件升级就复制jail升级调试完切换。配合zfs更灵活。//FreeBSD
    feikaras
        70
    feikaras  
       2015-06-25 01:59:40 +08:00
    @cxshun 还没搞懂规则就先弄规则。抱怨啥。本来编译就不是给用户用的。既然是开发者就有学习的义务。别提msi,玩坏了只能装系统。
    MetroWind
        71
    MetroWind  
       2015-06-25 03:07:08 +08:00
    你是自己编译的么……?体力活啊…… IM 这种东西还是得用个包管理器。

    不过 IM 神器啊!!!!
    valkjsaaa
        72
    valkjsaaa  
       2015-06-25 05:23:14 +08:00 via iPhone
    给楼主和大家推荐一个不用换发行版,源码编译,保持最新的管理神器,而且还不需要 root 权限: Linuxbrew。没错,就是 Homebrew 的 Linux port…
    endrollex
        73
    endrollex  
       2015-06-25 06:55:46 +08:00
    要找到lib的判断路径,像centos的软件要装最新版只能自己折腾,这个是经常遇到的问题
    lilydjwg
        74
    lilydjwg  
       2015-06-25 08:00:08 +08:00
    @jackieyang51 和 Gentoo Prefix 相比如何呀?
    lilydjwg
        75
    lilydjwg  
       2015-06-25 08:05:25 +08:00
    @LeoQ 呃,mplayer configure 出错了不会报错退出么,还是说只是可选依赖?又或者是你的 shell 没有显示上条命令的退出码所以你没有注意到 configure 失败了?

    我记得我学会编译安装东西的时候已经对 Linux 命令行比较了解了,也会盯着命令输出看。在那之前只用软件源。Ubuntu 的软件源里东西还是挺丰富的。后来换 Arch 了,自己主系统上也是只用 pacman 了,如果源里没有我就去打包一个 :-D
    lilydjwg
        76
    lilydjwg  
       2015-06-25 08:21:21 +08:00
    @jackieyang51 看它们的 issues,linuxbrew 好像连安装 Python 都有问题呢。
    sheaven
        77
    sheaven  
       2015-06-25 08:21:35 +08:00 via Android
    redhat/centos/fedora 系,有一个源叫epel 可以解决楼主困惑
    holulu
        78
    holulu  
       2015-06-25 08:46:23 +08:00
    pkgs.org 搜一下,看第三方仓库有没有你要的,有些项目自身也有软件仓库的,从他们的仓库一般可以安装不同的版本。
    aec4d
        79
    aec4d  
       2015-06-25 09:29:44 +08:00
    @southwolf 我昨天do-release-upgrade升级到15.04也是4.0内核 docker报错了https://github.com/docker/docker/issues/12002
    然后sudo systemctl enable docker就可以了 或许你也是这个问题~~~
    Dongdong36
        80
    Dongdong36  
       2015-06-25 09:34:49 +08:00
    自从用了Fedora, 我也不编译软件了,人生苦短,远离编译
    lvvj
        81
    lvvj  
       2015-06-25 09:56:00 +08:00 via Android
    本以为docker的出现能减轻运维身上的许多压力,不过看讨论…看来以后不能只玩apt了,不然毕业找不到工作啦,2333
    cxshun
        82
    cxshun  
    OP
       2015-06-25 10:18:01 +08:00
    @neoblackcap 不是,我不是指一定要知道原因,而是怎么去排除问题,不可能一出问题就换版本的啊。所以是否需要换版本这个考虑上还是蛮困难的。
    比如windows出问题的时候,我们不是一开始就想着换版本,而是先找问题,看是不是自己的问题嘛,如果不是自己的问题,再考虑换系统或重装。所以在编译这块,我会想,找不到那个libpng会不会是自己装的有问题,所以就一直找,最后没办法,猜想可能是版本问题才换的,原因什么的不重要(因为那个东西不是自己写的),最重要是解决问题嘛。
    @lvvj docker里面就是linux哈,也是可以apt的啊。
    @feikaras 好吧,看来要去学习下了
    @jackieyang51 还有这么高级的东西,赶紧瞧瞧去。
    @LeoQ 这种不依赖特定版本的还好,要是依赖某一个特定版本的so那才是坑爹,别人改个名字就只能杯具了。
    @lirau 同意,看来要去学习看看make相关的东西。但遇到这种版本问题,需要自己去查找会比较耗时哈。
    @lilydjwg 貌似当时找不到,如果所有开源软件都这么规范那就好了。
    @cbsw 这个依赖倒是明白,所以我在后面说了,把所有依赖打成一个包是最好的,类似windows的msi和osx的pkg或app,不说另外两个多好,但起码解决了部分依赖问题。
    好吧,大家都在安利arch,我要去试下了。
    @zhengkai 我把debian里面跟jpeg和png相关的lib装了个遍,dev和非dev全装了,都不行啊,google大半天,也没人有同样的问题,而且大家都用比较老的版本,哭。如果装完OK,那就不用大半天时间啦。
    @southwolf 然后呢?只能恢复了吗?好悲伤的故事啊。
    @stevegy 对的,就是png那个delegate找不到,实际上就是libpng那些依赖找不到,但已经装好的。
    Linusyeung
        83
    Linusyeung  
       2015-06-25 10:42:06 +08:00 via iPhone
    从来不自己编译…

    就像
    @LeoQ 的精力,一般人耗不起吧。
    ctexlive
        84
    ctexlive  
       2015-06-25 11:43:26 +08:00
    根据lz的情况,如果你确认Image magick需要最新的版本,而debian源里的旧版本不足你使用,那么你有好几种方式:
    1.如果你不打算自己从头编译(像你情况最好避免自己编译,因为你没有能力解决编译依赖).最好选一个有最新版Image magick源的linux发行版.如ubuntu的ppa源,archlinux(一般官方源里就足够新).
    2.如果你非要源代码开始编译,请先学会如何创建一个独立的环境进行编译.源代码编译windows下和linux下没有本质区别,通常可能linux下源代码编译更方便.不信你去win下自己编译Image magick试试.别告诉我win下一个包解决,那是人家帮你编译好了,你偷懒了而已.linux下同样有编译好的,只是你自己不会用或者不想用而已.比如im的官方就提供了unix的二进制版.
    http://www.imagemagick.org/script/binary-releases.php#unix
    这个地址里提供了最新版的Redhat / CentOS 5.11的rpm包, cygwin,mingw包.
    在官网里再转下就能找到非rpm系列的通用linux二进制包ImageMagick-x86_64-pc-linux-gnu.tar.gz
    http://www.imagemagick.org/download/binaries/
    你只要解压,根据说明设置下环境变量就能使用.真不知道lz到底在网站上干了些什么.
    ctexlive
        85
    ctexlive  
       2015-06-25 11:44:51 +08:00
    @cxshun “实际上就是libpng那些依赖找不到,但已经装好的。”-》你什么信息都没提供,人家怎么帮你解答?
    wych
        86
    wych  
       2015-06-25 11:59:44 +08:00
    一般的,信任包管理器就好。
    有特殊需要要自己维护软件包版本的,请找一个人来维护。不要在这里吐嘈编译的问题,那是基本功不过关。
    cxshun
        87
    cxshun  
    OP
       2015-06-25 12:19:48 +08:00
    @wych 我没吐槽编译的问题,请看清楚内容,我吐槽的只是版本的问题。编译我可以搞定,而且整个编译一点问题都没有,只是使用的时候出问题罢了。而且编译的问题,我自己有能力可以解决,解决不了的,我可以google,总之都可以找到办法解决。
    @ctexlive 我不需要大家帮忙解答编译问题,谢谢。同时请注意,我并不是在求助,让大家帮忙解决这个软件编译的问题。我只是问大家遇到这些版本依赖比较严重的,但同时需要自己编译的软件是怎么解决的。大家一起讨论而已。
    @Linusyeung 是啊,我有能力可以去解决,但每个软件都这样花费大把时间,简直是伤不起啊。
    MntCw
        88
    MntCw  
       2015-06-25 12:31:47 +08:00
    linux中发现的错误都是用户使用不当造成的,也是醉了。
    linux目前只能是活在Geek用户群里了。
    LeoQ
        89
    LeoQ  
       2015-06-25 12:46:11 +08:00 via Android
    @lilydjwg 可选依赖,是的,包括mp3, alsa在内的都被认为是可选依赖,可以生成makefile 如果config报错是makefile是不会生成的。
    raptor
        90
    raptor  
       2015-06-25 12:58:05 +08:00
    @likuku 对,和基本系统隔离很重要。当然现在Linux有Docker
    wych
        91
    wych  
       2015-06-25 13:22:29 +08:00
    @cxshun 不冲突啊,如果所有的依赖源码都放在一起,只要基础包在任何人都可以./configure && make && make install. 复杂的地方就是这种版本依赖的问题,我的意思就是处理这种问题的方法就那么集中:
    1. 用跟进比较快的发行版,比如arch,线上用debian也可以,一般debian的最新版里软件包版本也够用了。
    2. 找人/自己维护一个仓库,在一个地方把包编译好然后放到各处安装。

    我吐嘈的是这句话「有时候,我会想,这些源代码编译软件的存在,就是为了折磨我们吗?这版本依赖的存在,相比windows和mac的一个包搞定的,简直是坑爹得不行。 」

    你在windows下和mac下去编译安装的时候,也会碰到相同的版本依赖的问题,解决起来一样的痛苦。而你所说的一个包搞定,对应的也就是Linux里的包管理器,只不过可能有些包windows/mac有人打好了包,你可以直接用,而在Linux里面,每个发行版都有自己跟进新版本的规则,导致你找不到最新的打好了的包,这时候就需要动手解决,而在解决的时候碰到了问题就好好说问题,这种抱怨是没有帮助的。

    针对这个编译的问题,新版本的不认libpng,应该去看config.log,如果要需求帮助,应该把这些错误贴出来,补充好上下文,让大家一起看。
    ctexlive
        92
    ctexlive  
       2015-06-25 13:29:28 +08:00
    @cxshun “我只是问大家遇到这些版本依赖比较严重的,但同时需要自己编译的软件是怎么解决的。大家一起讨论而已。 ”-》没人故意教你,这里只是针对你提出的问题的举例,而事实上你确实解决的不好...我们对你的编译解决能力只能通过你的语言来判断,也无意故意贬低你.从你的描述看你,你一方面拿“linux下的编译依赖”和“这版本依赖的存在,相比windows和mac的一个包搞定的,简直是坑爹得不行。”来比较,不是一个层面的东西,本身不觉得很奇怪么?当然,你如果只是拿出“源代码编译”是否有很多坑,那你至少在问题描述里体现的观点就有问题.要比就要用对等的对象来比.编译的依赖,无非就是自动解决依赖和手动解决依赖.自动解决依赖以及描述过,我实证看不出win和mac哪里解决的更好.手动解决依赖三者都一样.况且你如果用apt,pacman等自动依赖解决系统,显然会更方便.

    “相关0.0.1都编不过,从那个时候开始,遇到需要编译安装的软件,我就觉得好日子好像又到头了。"..事实上,你所谓的编译不过,很可能就是代码本身质量不好造成.而且你没提供任何编译的出错信息,大家根本无从判断到底是”代码本身问题“,还是”依赖本身“问题,或者其他问题.讨论问题当然要就事论事,针对你提出的案例讨论.
    izoabr
        93
    izoabr  
       2015-06-25 13:49:53 +08:00
    那gentoo。。。矮油···
    cxshun
        94
    cxshun  
    OP
       2015-06-25 14:08:11 +08:00
    @ctexlive 多谢,确实,源代码和win、mac上面的包不是一个东西。我描述的不大清楚,见笑了。但提出这个问题的重点是在后面,如果大家遇到一些自己要用的东西,但由于遇到一些依赖的问题,是绕过呢,还是去解决(解决意味着要花费比较多的时间)。
    @wych 确实,我的对比不大合理。多谢指正。
    wych
        95
    wych  
       2015-06-25 17:28:42 +08:00
    @cxshun 我的做法一般是,如果程序必须用某个版本(有时候是旧的版本),那么我会尽量完成一次编译安装,然后按照发行版本的规则打包,放到自己维护的repo里面。如果不是,在程序里可以绕过,那么就绕过好了。
    benjiam
        96
    benjiam  
       2015-06-25 17:34:24 +08:00
    我觉得楼主说了一个非常重要的问题。

    其实无论是否源码编译 用yum 甚至 apt-get 都没有完全解决这个问题。

    windows 里面也有这个问题 , 虽然很多年来ms 就号称解决了这个问题,但是我们知道其实没有

    一项项的看

    1 源码编译,
    基本是一个彻底的解决方法。唯一要看的就是编译的时候一堆堆一堆的depends.

    depends 问题可以解决,但是更关键是 编译参数的设置,比如 nginx 的可配置的参数, php 的可配置参数 对于一个使用者,如何详细辨别 需要设置的编译参数 我觉得很难。看configure --help... 其实和看汽车说明书差不多,有多少人是只会开,连换个轮胎都不会。 你知道php 这么多配置参数 应该如何组合才是最正确的吗? 我不知道,我只能选几个我需要的模块 然后编译一下

    2 yum apt
    是比较好的方案,但是主要的问题有2个, 第一个 没有该包的源 第二个 如果有冲突问题 那就很难,我反正没办法

    第一个 比如我们需要在ubuntu12.04 上使用比较新的软件 libboost 但是最新的包只会发布在14.04, 我的选择基本上就只有自己拖source, 在ubuntu 12.04 重新打包, 重新打包带来的问题非常的多,解决起来非常的难,做过的都知道
    第二 本质还是依赖,在yum 和apt 里面 遇到一次2个包 有冲突无法共存,你必须做出一个2选1,想利用yum 让他们共存基本不可能。
    第三 还有个问题 就是依赖太大了,装一个软件 需要装a, 结果a要求升级glibc, 然后 一下子就是2G的新软件包,一次性升级了几百个软件,对于大型在线系统,这样的解决方案实战不能接受。


    3 windows
    对于这个问题解决的相对比较好, 从windows98 上拿个游戏copy 到winxp win7 上基本都能运行起来,不会出现什么问题。但是早期的dll hell,也真是让人欲哭无泪,但是windows 完全解决这些问题了吗? Visual Studio 2010 Redistribute Package 这个包 大家很熟悉吧。 我的qq 在每次重装以后就必须重新安装, 装Redistribute Package 也不行。 但是对于大多数情况,我觉得做得都很对。

    4 gentoo ?
    简单玩过LFS gentoo 不评价

    我心中理想的解决办法: 去掉动态编译,只是用静态编译 类似golang, 虽然动态编译减少了体积和运行时大小,提高了运行速度,但是带来的问题太多了。 作为一个产品最基本的一个要素 快速发布因为这个原因被大大的削弱。在这个CPU memory disk 都有富裕的时代,应该使用静态编译 copy paste 进行发布!
    wych
        97
    wych  
       2015-06-25 18:01:21 +08:00
    @benjiam 全部静态编译没有解决第一个问题:编译时的参数,可能90%的需求只需要默认的编译参数就好了,那么剩下来的那些需求,会有专门的人去处理掉。反过来,如果默认打包时把所有的特性都加上,一来不是所有人都用得到,二来说不定会出现什么问题。所以如果要在Linux下使用,学好打包及包管理还是有比需要的。

    至于未来和自己的业务,我也静态编译的方法。
    benjiam
        98
    benjiam  
       2015-06-25 21:48:21 +08:00 via iPad
    还有很多覆盖面我没仔细提到 比如yum的专人测试,这是普通源码编辑享受不到的。静态编译的配置参数和源码编译是一样的。静态编译还有个现实问题就是各种平台各种库以及内核版本非常不一致,导致可靠性大大涩口。windows类似独 x 还有Ios 的确也有很多问题,linux和android犹如共和,但是开放的就是最好的吗?



    秦始皇统一文字度量衡 文字 是对自由的滞空还是推动文明的进步?
    rrfeng
        99
    rrfeng  
       2015-06-25 22:39:32 +08:00
    比如我今天装 sentry 报错说找不到 xmlversion.h 但是明明版本也对文件也在,却是因为缺少 libxlst-devel ……

    我觉得楼主的问题是,编译知识/技巧不够多,其实很容易发现问题在哪里的
    如果能看懂源码,就更棒了。
    benjiam
        100
    benjiam  
       2015-06-25 23:59:52 +08:00 via iPad
    呵呵,因为版本升级导致接口你要改源码 有没有,哪怕接口没变,头文件内容的分布变了,要求include新文件 有没有 ,因为gcc升级,代码安全要求提高,源码无法编译要改掉警告有没有 。 l

    java里面 使用了a b 2个包,a用了c1.0 b用了c 2.0 c1.0 和c2.0 接口不兼容,有没有。

    这一切根本不应该让使用者去解决。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6059 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 06:18 · PVG 14:18 · LAX 22:18 · JFK 01:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.