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

前端之家收集整理的这篇文章主要介绍了c – OSX动态链接优先级之间的冲突?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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 /及其亲属.

猜你在找的C&C++相关文章