OSX中动态链接优先级之间的冲突?

时间:2013-07-14 20:35:26

标签: c++ macos macports dylib

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/lib移除DYLD_LIBRARY_PATH显然可以解决问题,但会为其他依赖项带来问题?)

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

6 个答案:

答案 0 :(得分:32)

我在MacOS El Capitan中使用OpenCV时遇到了类似的问题。使用link

中的解决方案解决了问题

解决方法是删除/ 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

答案 1 :(得分:9)

您不应使用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编辑使用的路径,但是有些情况下这不起作用,例如,如果新路径比旧路径长并且您没有t将其与-header_pad_max_install_names链接。首选使用正确的路径进行重建。

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

答案 2 :(得分:7)

尝试在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

答案 3 :(得分:6)

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

qtcreator

答案 4 :(得分:2)

我有类似的错误,我解决了将以下变量放入我的bash_profile:

export DYLD_LIBRARY_PATH=/usr/lib/:$DYLD_LIBRARY_PATH

答案 5 :(得分:0)

我按照mdemirst建议的指示,解决了我的问题。我正在使用OS X Sierra。

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

Gist to fix Spidermonkey errors