17

OSX 上不同的 libjpeg 动态库之间存在动态链接冲突。首先有一个标准的原生 libJPEG.dylib(在 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/ 中)。但是如果你使用的是 MacPorts,你也可以在(在 /opt/local/lib 中)有一个与端口相关的 libjpeg.dylib。例如,后者可能已作为某个其他端口的依赖项安装。

当您链接到系统 libJPEG(这是首选)时,这会产生问题。然后如果/opt/local/lib在DYLD_LIBRARY_PATH中,则在搜索动态库时会优先考虑该路径,导致加载符号时出现运行时错误:

dyld: Symbol not found: __cg_jpeg_resync_to_restart
 Referenced from:
/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
 Expected in: /opt/local/lib/libJPEG.dylib
in /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
Trace/BPT trap: 5

所以我有两个问题(可能相关):

  1. 什么是解决实际问题的好方法(/opt/local/libDYLD_LIBRARY_PATH显然可以解决它但会给其他依赖项带来问题)?

  2. 搜索动态库的其他路径(即“/System/Library”路径在哪里指定)以及为什么 DYLD_LIBRARY_PATH 的优先级更高?

4

6 回答 6

32

我在 MacOS El Capitan 中使用 OpenCV 时遇到了类似的问题。使用链接中的解决方案解决了问题

解决方法是删除/usr/local/lib目录下的一些dlylibs,并创建指向相关文件/System/Library/Frameworks/ImageIO.framework/Resources/的符号链接

cd /usr/local/lib
rm libgif.dylib
ln -s /System/Library/Frameworks/ImageIO.framework/Resources/libGIF.dylib libGIF.dylib
rm libjpeg.dylib
ln -s /System/Library/Frameworks/ImageIO.framework/Resources/libJPEG.dylib libJPEG.dylib
rm libtiff.dylib
ln -s /System/Library/Frameworks/ImageIO.framework/Resources/libTIFF.dylib libTIFF.dylib
rm libpng.dylib
ln -s /System/Library/Frameworks/ImageIO.framework/Resources/libPng.dylib libPng.dylib
于 2016-01-28T19:42:08.240 回答
11

您不应该使用DYLD_LIBRARY_PATH. 正如您所发现的,这往往会爆炸。可执行文件和库应该在链接时将其库要求内置到其中。用于otool -L找出文件要查找的内容:

$ otool -L /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO:
    /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO (compatibility version 1.0.0, current version 1.0.0)
    ...
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)

对于我的自制程序之一的示例:

$ otool -L /usr/local/bin/gifcolor
/usr/local/bin/gifcolor:
    /usr/local/Cellar/giflib/4.1.6/lib/libgif.4.dylib (compatibility version 6.0.0, current version 6.6.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)

请注意,它引用了/usr/local. 如果您以引用错误库的方式构建它,我建议重新构建它并将其指向正确的库。

如果这不可能,则可以使用 编辑使用的路径install_name_tool,但在某些情况下这不起作用,例如如果新路径比旧路径长并且您没有将其链接到-header_pad_max_install_names. 首选使用正确的路径进行重建。

请注意,有一些可用的“特殊”路径允许相对于它们的加载器找到库。请参阅手册页@executable_path/中的及其亲属。dyld(1)

于 2013-07-15T01:32:31.850 回答
10

如果使用Qt Creator,您必须Add build library search path to DYLD_LIBRARY_PATH and DYLD_FRAMEWORK_PATH从选项卡中的Run部分取消选中该Projects选项:

qt创作者

于 2018-05-30T21:19:44.417 回答
8

尝试在 macOS Sierra 上运行 Apache Celix 时出现类似错误如果您使用 Homebrew 安装 libjpeg、libtiff、libpng,这可能会使链接器混淆以使用 macOS imageIO 库。简单的修复是取消链接这些库:

brew unlink libpng
brew unlink libtiff
brew unlink libjpeg

每当我们需要时重新链接这些库:

brew link libpng
brew link libtiff
brew link libjpeg
于 2017-03-10T01:23:54.103 回答
3

我遇到了类似的错误,我解决了将以下变量放入我的 bash_profile 的问题:

export DYLD_LIBRARY_PATH=/usr/lib/:$DYLD_LIBRARY_PATH
于 2014-09-03T16:39:28.120 回答
0

我按照 mdemirst 建议的说明进行操作,它解决了我的问题。我正在使用 OS X Sierra。

我创建了一个要点,以防其他人遇到同样的问题。

修复 Spidermonkey 错误的要点

于 2017-03-06T23:15:50.093 回答