OSX上的不同libjpeg动态库之间存在动态链接冲突.首先有一个标准的本机libJPEG.dylib(在/System/Library/Frameworks/
ImageIO.framework/Versions/A/Resources/中).但是如果您使用MacPorts,也可以在/ opt / local / lib中使用与port相关的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
所以我有两个问题(可能相关):
>什么是解决实际问题的好方法(从DYLD_LIBRARY_PATH删除/ opt / local / lib显然解决了它,但为其他依赖关系创建问题)?
>搜索动态库的其他路径(也就是指定“/ System / Library”路径在哪里),为什么DYLD_LIBRARY_PATH优先级更高?
解决方法
您不应该使用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链接.使用正确的路径重建是首选.
请注意,有一些“特殊”路径可用于允许相对于其加载程序找到库.请参阅dyld(1)手册页中的@ executable_path /及其亲属.