【问题标题】:Inkscape 0.92.2 compilation: links with two libMagick versionsInkscape 0.92.2 编译:与两个 libMagick 版本的链接
【发布时间】:2018-03-08 06:05:31
【问题描述】:

我已编译 Inkscape 0.92.2(在 Slackware64-current Linux 上),但无法导出为 PNG。

我发现一些参考资料表明 libpng 可能是罪魁祸首。事实上,我发现 inkscape 可执行文件与两个版本的 libpng(1.5 和 1.6)相关联。

大量跟踪和调试表明问题似乎是可执行文件与两个版本的 libMagick(6 和 7)链接,它们导入了不同版本的 libpng。

检查 Inkscape config.log 文件显示确实访问了两个库:

pkg_cv_IMAGEMAGICK_LIBS='-lMagick++-6.Q16 -lMagickWand-7.Q16HDRI -lMagickCore-7.Q16HDRI'

编辑:根据 emcconville 的建议,我添加了 --with-magick-plus-plus=yes 并重新编译了所有内容(ImageMagick 和 Inkscape。不过运气不好:

$ ldd /usr/bin/inkscape | grep Magick
    libMagick++-6.Q16.so.5 => /usr/lib64/libMagick++-6.Q16.so.5 (0x00007f5ee46f3000)
    libMagickWand-6.Q16.so.2 => /usr/lib64/libMagickWand-6.Q16.so.2 (0x00007f5ee43d3000)
    libMagickCore-6.Q16.so.2 => /usr/lib64/libMagickCore-6.Q16.so.2 (0x00007f5ee3d23000)
    libMagickWand-7.Q16HDRI.so.5 => /usr/lib64/libMagickWand-7.Q16HDRI.so.5 (0x00007f5ee2e9b000)
    libMagickCore-7.Q16HDRI.so.5 => /usr/lib64/libMagickCore-7.Q16HDRI.so.5 (0x00007f5ee27a3000)

也许在第 6 版中还有另一个库。虽然我似乎找不到哪个。

Edit2:在应用 emcconville 的步骤之前,我想了解发生了什么......

这些是实际的库及其链接:

libMagick++                         so -> so.5.0.0
                                    so.5 -> so.5.0.0
                                    so.5.0.0
libMagick++-6.Q16           a   la  so -> so.5.0.0
                                    so.5 -> so.5.0.0
                                    so.5.0.0
libMagick++-7.Q16HDRI       a   la  so -> so.4.0.0
                                    so.4 -> so.4.0.0
                                    so.4.0.0
libMagickCore-6.Q16         a   la  so -> so.2.0.0
                                    so.2 -> so.2.0.0
                                    so.2.0.0
libMagickCore-7.Q16HDRI     a   la  so -> so.5.0.0
                                    so.5 -> so.5.0.0
                                    so.5.0.0
libMagickWand-6.Q16         a   la  so -> so.2.0.0
                                    so.2 -> so.2.0.0
                                    so.2.0.0
libMagickWand-7.Q16HDRI     a   la  so -> so.5.0.0
                                    so.5 -> so.5.0.0
                                    so.5.0.0
libMagickCore                       so -> so.5.0.0
                                    so.5 -> so.5.0.0
                                    so.5.0.0
libMagickWand                       so -> so.5.0.0
                                    so.5 -> so.5.0.0
                                    so.5.0.0

这似乎可以接受,除了(未版本化的)libMagic++libMagickCorelibMagicWand,我怀疑它们是 5.xxx 版并且可以删除。

.PC 文件稍微复杂一点:

---- Version 6 pc files ---------Version 7 pc files ------
ImageMagick-6.Q16.pc        ImageMagick-7.Q16HDRI.pc
ImageMagick++-6.Q16.pc
Magick++-6.Q16.pc           Magick++-7.Q16HDRI.pc
MagickCore-6.Q16.pc         MagickCore-7.Q16HDRI.pc
MagickWand-6.Q16.pc         MagickWand-7.Q16HDRI.pc

--- Relationships:
ImageMagick.pc          -> ImageMagick-6.Q16.pc
Magick++.pc             is same as Magick++-7.Q16HDRI.pc (not a link!)
MagickCore.pc           is same as MagickCore-7.Q16HDRI.pc (not a link!)
MagickWand.pc           is same as MagickWand-7.Q16HDRI.pc (not a link!)

注意:ImageMagic.pc 指向版本 6, 并且没有生成 ImageMagick++-7.Q16HDRI.pc(即使启用了 ++ 编译选项)

Edit3:今天我再次重新编译了 ImageMagick 的最后一个版本,这次更密切地监控它生成和安装的文件。 @emcconville 建议对 pc 文件使用符号链接似乎并不完全实用,因为每次安装都会覆盖这些符号链接。 (见edit2中的最后一个表)。尽管如此,虽然这个系统是这样的,但似乎没有任何其他解决方案。

【问题讨论】:

  • 您是否使用 CPP 库 (--with-magick-plus-plus=yes) 配置/安装了 ImageMagick-7?
  • 嗯。不,我没有。在我写的时候编译……完成了。我检查了已安装的库,没有看到任何新文件。我现在正在重新编译inkscope。将报告结果。
  • @emcconville - 似乎不走运。我已经更新了原帖。
  • 我怀疑这与一些未删除的.pc 文件有关。 pkg-config --libs ImageMagick ImageMagick++ 的输出是什么?如果同时显示 IM-6 和 IM-7 库,您可能会遇到更大的问题。
  • 是的,两者都存在——这怎么可能?是 ImageMagick++ 引入了错误的版本。 $ pkg-config --libs ImageMagick ImageMagick++ -lMagickCore-7.Q16HDRI -lMagick++-6.Q16 -lMagickWand-7.Q16HDRI -lMagickCore-7.Q16HDRI

标签: linux compilation imagemagick inkscape


【解决方案1】:

我想我知道发生了什么,但这更像是一种“预感”而不是答案。

我怀疑有一个额外的.pc 脚本在浮动,您只需将其删除即可。

  1. 找到ImageMagick.pc & ImageMagick++.pc 的位置。这通常在/usr/share/pkgconfig//usr/local/share/pkgconfig//usr/lib/pkgconfig//usr/lib64/pkgconfig/ 等下。

    不要只停留在第一场比赛,而是使用locatefind 实用程序扫描所有内容。

    find /usr/ -name "ImageMagick*.pc" -type f
    
  2. 你应该有一个看起来像....的列表

    /usr/local/share/pkgconfig/ImageMagick++.pc
    /usr/local/share/pkgconfig/ImageMagick.pc
    /usr/local/share/pkgconfig/ImageMagick++-6.Q16.pc
    /usr/local/share/pkgconfig/ImageMagick-6.Q16.pc
    /usr/local/share/pkgconfig/ImageMagick++-7.Q16HDRI.pc
    /usr/local/share/pkgconfig/ImageMagick-7.Q16HDRI.pc
    
  3. 核对有问题的文件。

    # Create a backup place
    mkdir -p ~/backups
    # Archive `.pc' files for future investigations.
    gzip < /usr/local/share/pkgconfig/ImageMagick.pc > ~/backups/ImageMagick.pc.gz
    gzip < /usr/local/share/pkgconfig/ImageMagick++.pc > ~/backups/ImageMagick++.pc.gz
    # Remove
    sudo rm /usr/local/share/pkgconfig/ImageMagick.pc
    sudo rm /usr/local/share/pkgconfig/ImageMagick++.pc
    # Repeat as nessasry for duplicate instances,
    # but KEEP files with version prefixes (i.e `-6.Q16' & `-7.Q16HDRI') 
    
  4. 创建符号链接(假设 ImageMagick-7 是您系统的默认版本)。

    sudo ln -s /usr/local/share/pkgconfig/ImageMagick-7.Q16HDRI.pc /usr/local/share/pkgconfig/ImageMagick.pc
    sudo ln -s /usr/local/share/pkgconfig/ImageMagick++-7.Q16HDRI.pc /usr/local/share/pkgconfig/ImageMagick++.pc
    
  5. 重建inkscape,并确认问题已解决。

  6. 给未来的自己写一张便条,描述你做了什么,并重复/恢复步骤。有些程序尚未迁移到 IM-7,因此您很可能需要更新通用的 .pc 文件以指向 IM-6(或其他方式)。

【讨论】:

  • 我为延迟道歉。我注意到缺少一些 pc 文件,Magick 文件本身中有一些奇怪的版本(并且没有生成其中一个 ++ 文件)。在不了解我在做什么的情况下,我不想做你的建议。我现在稍微平静了一些,我会在整理完后立即报告。已经谢谢了!
  • 今天做了更多的研究。在 edit3 下更新原始邮件
猜你喜欢
  • 2019-03-15
  • 2017-06-04
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 2012-05-08
相关资源
最近更新 更多