Macos 解析Mac OS Catalina上的动态库位置

Macos 解析Mac OS Catalina上的动态库位置,macos,dylib,ldd,Macos,Dylib,Ldd,我试图理解MacOSCatalina在运行时确定动态库的位置并解决名称冲突的过程。本网站上的信息: 意味着存在一个搜索层次结构,该层次结构从LD_LIBRARY_PATH的内容开始,并通过许多其他环境变量移动;其中一个,DYLD_FALLBACK_LIBRARY_PATH,如果没有显式设置,则具有默认值,其中包括像/usr/lib这样的位置 然后我看到,如果我用ldd-d查看库的依赖关系,它会用路径信息显示每个库的依赖关系: nasmac3465:libs ptenenba$ ldd -d l

我试图理解MacOSCatalina在运行时确定动态库的位置并解决名称冲突的过程。本网站上的信息:

意味着存在一个搜索层次结构,该层次结构从LD_LIBRARY_PATH的内容开始,并通过许多其他环境变量移动;其中一个,DYLD_FALLBACK_LIBRARY_PATH,如果没有显式设置,则具有默认值,其中包括像/usr/lib这样的位置

然后我看到,如果我用ldd-d查看库的依赖关系,它会用路径信息显示每个库的依赖关系:

nasmac3465:libs ptenenba$ ldd -d libtess-mod.dylib
libtess-mod.dylib:
Contents of (__DATA,__data) section
000000000001cb80    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
000000000001cb90    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
000000000001cba0    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    /Users/ptenenba/git/tess/spoc/code/dist/libs/libtess-mod.dylib (compatibility version 0.0.0, current version 0.0.0)
    /opt/local/lib/libgcc/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.28.0)
    /Users/ptenenba/git/tess/spoc/code/dist/libs/libtess-common.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.100.1)
    /opt/local/lib/libgcc/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
nasmac3465:libs ptenenba$ 

我的问题:当每个库都有其依赖项的名称和路径时,为什么我需要使用LD_library_PATH或DYLD_library_PATH指定任何库搜索路径?

通常,将环境变量与
DYLD
动态库加载器一起使用是不必要和不可取的。相反,应该在链接阶段设置路径,或者稍后使用
install\u name\u tool

修改路径。让我确保我理解您的回答:您是说链接时库的位置将在运行时使用,因此DYLD\u library\u路径应该只在中使用(希望很少使用)需要覆盖该库并在不同位置使用库运行的情况。是吗?不,在链接时,您需要在安装的路径名中标记。使用环境变量控制
dyld
时出现的一个问题是找到多个合适的库,从而导致未定义的行为。IMHO覆盖库的正确方法是将其完全交换到位。另一种覆盖库的简便方法是在安装路径中使用
@rpath
,并在需要时更改
@rpath
。也就是说,如果我可以使用环境变量加载并使用出现故障的代码,我会告诉自己,如果我做错了,它可以正常工作,现在如何实际修复它。