我读到一些文章不鼓励使用 DYLD_LIBRARY_PATH,因为动态库的路径应该使用 -install_name、@rpath 和 @loader_path 来固定。
就制作一个同时在 Linux 和 Mac OS X 上运行的程序而言,Mac OS X 的 DYLD_LIBRARY_PATH 与 Linux 的 LD_LIBRARY_PATH 完全相同。而且,我们可以共享(几乎)相同的没有 -install_name 和 @rpath 的 make 文件。
- 可以在 Mac OS X 上使用 DYLD_LIBRARY_PATH 吗?
- 当二进制文件找不到动态库时,Mac OS X 的动态库搜索算法是什么?当前目录 -> DYLD_LIBRARY_PATH 目录...?
最佳答案
正如您所注意到的,DYLD_LIBRARY_PATH
行为类似于 LD_LIBRARY_PATH
在其他 *nix 上。但是,您应该查看另一个环境变量,名为 DYLD_FALLBACK_LIBRARY_PATH
.
一般来说,这些(在 osx 和 linux 上)仅建议用于开发用途,因为当您使用不具有相同符号表的库覆盖时,它们可能会导致符号查找错误。一个很好的例子是当您尝试使用自定义安装覆盖 VecLib(例如 blas lapack)的默认安装时。如果DYLD_LIBRARY_PATH
,这将导致链接到系统VecLib的应用程序中出现符号未找到错误已设置,如果未设置,则相反(自定义应用程序中的符号查找错误)。这是由于系统 blas/lapack 不是 ATLAS 库的完整实现。
DYLD_FALLBACK_LIBRARY_PATH
不会产生这些问题。
将库安装到非标准位置时,DYLD_FALLBACK_LIBRARY_PATH
更加理智了。这将在默认路径中提供的库中查找符号,如果在那里找不到该符号,则回退到指定的路径。
好处是,此过程不会在针对默认库编译的应用程序中导致符号查找错误。
通常,当库安装到非标准位置时,应指定绝对路径,这可以消除动态查找的歧义。
关于language-agnostic - 可以在 Mac OS X 上使用 DYLD_LIBRARY_PATH 吗?还有,它的动态库搜索算法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3146274/