【问题标题】:Ubuntu: Updating libpng [closed]Ubuntu:更新 libpng [关闭]
【发布时间】:2015-12-08 22:38:38
【问题描述】:

我需要运行 Ubuntu 实用程序“convert”,然后我收到一条错误消息,指出我的 libpng 版本已过时,必须更新。所以,我走的是“apt-get install”的常规路线,但由于我现在不记得的原因,这并没有解决问题。这就是事情变得混乱的地方。我下载了 libpng 的源代码,做了一个 make 和一个 make 安装。我现在在 /usr/local/lib 中有以下文件:

-rw-r--r-- 1 root root 821564 2015-09-11 18:37 /usr/local/lib/libpng16.a
-rwxr-xr-x 1 root root    937 2015-09-11 18:37 /usr/local/lib/libpng16.la
lrwxrwxrwx 1 root root     19 2015-09-11 18:37 /usr/local/lib/libpng16.so -> libpng16.so.16.18.0
lrwxrwxrwx 1 root root     19 2015-09-11 18:37 /usr/local/lib/libpng16.so.16 -> libpng16.so.16.18.0
-rwxr-xr-x 1 root root 602132 2015-09-11 18:37 /usr/local/lib/libpng16.so.16.18.0
lrwxrwxrwx 1 root root     10 2015-09-11 18:37 /usr/local/lib/libpng.a -> libpng16.a
lrwxrwxrwx 1 root root     11 2015-09-11 18:37 /usr/local/lib/libpng.la -> libpng16.la
lrwxrwxrwx 1 root root     11 2015-09-11 18:37 /usr/local/lib/libpng.so -> libpng16.so

...这对我来说看起来很合理。但是,现在当我运行“转换”时,我收到一条错误消息:

convert: error while loading shared libraries: libpng.so.2: cannot open shared object file: No such file or directory

无奈之下,我创建了以下链接:

lrwxrwxrwx 1 root root     34 2015-09-11 18:39 /usr/local/lib/libpng.so.2 -> /usr/local/lib/libpng16.so.16.18.0

但我从 convert 收到相同的错误消息。显然,我现在已经超出了我的深度,希望能提供有关如何继续的任何提示。

【问题讨论】:

    标签: ubuntu libpng


    【解决方案1】:

    您可以通过LD_DEBUG 环境变量检查程序从何处加载库。例如,您可以运行:

    LD_DEBUG=all convert
    

    查看大量调试信息。你可以运行:

    LD_DEBUG=libs convert
    

    查看所有库的列表convert 正在动态加载。在您的情况下,您可以通过运行更具体:

    LD_DEBUG=libs convert 2>&1 | grep -i png
    

    样本输出


         20939: find library=libpng12.so.0 [0]; searching
         20939:   trying file=/lib/i386-linux-gnu/libpng12.so.0
         20939: calling init: /lib/i386-linux-gnu/libpng12.so.0
      -quality value       JPEG/MIFF/PNG compression level
         20939: calling fini: /lib/i386-linux-gnu/libpng12.so.0 [0]
    

    您也可以使用ldd 命令,即:ldd convert 来获得类似的结果,如@meuh 所述

    现在,请说出房间里的大象:Ubuntu 通过apt 进行包管理是有原因的:所以你不会破坏你的依赖关系。如果您确实需要更新版本的库,您应该:

    • Pull the prebuilt package from LaunchPad.net. 至少这样它是一个可以在未来以最小的麻烦恢复/卸载的包。
    • 使用“make install”捕获/打包工具,例如checkinstall。它从源代码构建包的“make install”阶段捕获输出文件/更改,因此您可以将其视为普通包,而不必寻找并手动清除/删除直接运行 @987654333 生成的文件@。您应该只在需要手动处理 deps 的系统上执行此操作,like good ol' Slackware. :)

    未来……

    您可以通过make 构建它,而不是直接安装libpng,将库/二进制文件复制到一个临时文件夹(即:/home/yourname/tmp),然后运行convert via:

    LD_LIBRARY_PATH=/home/yourname/tmp convert
    

    这将使提供的路径成为您启动的程序在解析共享对象时搜索的第一个位置。它会在那里找到您本地构建的libpng,仅此而已。无需占用整个系统即可测试单个库的完美方式。

    【讨论】:

    • 还有ldd 命令。
    • @meuh 没错。我走这条路是因为我想继续使用LD_LIBRARY_PATH 进行未来的测试。我会更新答案以提及这一点。
    • 感谢您的洞察力。我现在可以看到 convert 在哪里寻找库,以及它的
    • ...(笨拙的手指!)显然没有找到它。当我使用 apt-get install 时,我被告知我尝试安装的版本已经是最新版本,所以没有任何反应。无论如何,显然我不适合这个话题,所以我会说“谢谢你的帮助”并再见。
    • @PeterP 当您通过apt 安装时,它有一个已安装二进制文件、库等的系统目录。当您通过make install 安装源包时,它不会触及目录。您可能已经为您的系统安装了最新的 libPNG,但是您在没有让系统知道的情况下手动移动/删除了文件,因为您没有使用 aptdpkg 来执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 2011-08-27
    • 2015-12-20
    • 2012-08-25
    • 1970-01-01
    相关资源
    最近更新 更多