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

kam*_*gin 14 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
Run Code Online (Sandbox Code Playgroud)

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

  1. 什么是解决实际问题的好方法(/opt/local/libDYLD_LIBRARY_PATH显然解决它但从而为其他依赖创建问题)?

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

mde*_*rst 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
Run Code Online (Sandbox Code Playgroud)

  • 拯救生命!!!非常感谢。顺便说一句,在我的系统中,没有要删除的libgif.dylib。 (2认同)
  • 这很危险。链接到该位置并期望 Apple 提供的 dylib 的实际 macOS 应用程序将会中断。 (2认同)

Rob*_*ier 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)
Run Code Online (Sandbox Code Playgroud)

以我的自制程序之一为例:

$ 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)
Run Code Online (Sandbox Code Playgroud)

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

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

请注意,有一些"特殊"路径可用于相对于其加载器找到库.@executable_path/dyld(1)手册页中查看及其亲属.


小智 7

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

brew unlink libpng
brew unlink libtiff
brew unlink libjpeg
Run Code Online (Sandbox Code Playgroud)

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

brew link libpng
brew link libtiff
brew link libjpeg
Run Code Online (Sandbox Code Playgroud)


Iul*_*rei 6

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

qtcreator

  • 感谢您的回复,这对我帮助很大!我想这个复选框是在最新版本的QtCreator中引入的. (2认同)