OSX 运行时动态库路径搜索

5
在OSX上,我可以使用clang编译器编译C++源代码,并通过设置环境变量$LD_RUN_PATH告诉编译器动态库的位置。我想知道是否有一个相当的方法来搜索运行时动态库路径?
非常感谢!
编辑:
下面给出的重复链接不是我想要的!
我想将dylib的搜索路径编译到可执行文件中。在运行时,不能显式地设置$DYLD_LIBRARY_PATH环境路径中的任何路径信息。也就是说,当你回显$DYLD_LIBRARY_PATH时,不应该看到任何指向dylib的路径。
我通过使用以下方式实现了这一点:
otool -L <executable>

阅读我的可执行文件中的搜索路径。

对于任何错误或缺少的搜索路径,我使用install_name_too来更新或添加搜索路径信息。

对于我来说,我正在改变我的原始链接路径。我使用

install_name_tool -change <old_path> <new_path> <executable>

用于链接路径设置。在此之后,我可以正确运行可执行文件,将其链接到dylib,而无需在$LD_LIBRARY_PATH$LD_FALLBACK_LIBRARY_PATH中设置任何内容。


5
请看这里: https://dev59.com/3nA75IYBdhLWcg3ws7ci这篇文章讨论了在Mac OS X上使用"dyld_library_path"是否合适以及动态库搜索路径的含义。 - Jeremy Friesner
@JeremyFriesner 我已经查看了这个链接,并尝试通过设置DYLD_LIBRARY_PATH和DYLD_FALLBACK_LIBRARY_PATH来解决问题。这只解决了编译时动态库路径搜索的问题。当在运行时执行编译后的文件时,仍然会出现找不到库路径的错误。这不是我要找的。 - yc2986
在运行时执行编译后的文件时,仍然无法找到库路径,看起来您对DYLD_LIBRARY_PATH的使用是错误的。请注意,该变量应在运行可执行文件时设置。 - Tsyvarev
@Tsyvarev,我的问题不是关于如何设置DYLD_LIBRARY_PATH。显然,将DYLD_LIBRARY_PATH永久导出到.bash_profile或.bashrc文件中可以在运行时解决此问题。但我想要的是将搜索路径直接编译到可执行文件中。在Ubuntu Linux中,可以通过设置LD_RUN_PATH来在编译阶段实现这一点。我想知道是否有一个等效的环境变量适用于OSX。从搜索OSX文档中,我发现没有这样的环境变量。但是有一种方法可以实现这一点。我会添加到OP中。 - yc2986
哦,你之前的评论有点令人困惑,所以看起来你在寻找 DYLD_LIBRARY_PATH 变量。实际上,即使使用原始措辞,你的问题也显然不是重复的。对此造成的不便表示歉意。我投票支持重新开放。 - Tsyvarev
1个回答

1
在macOS上,使用LLVM编译器"clang"时,您可以使用-F{dir}和-I{dir}预处理器选项来搜索Framework / Library目录和Include目录。这将告诉编译器在哪里查找非标准位置的*.dylib动态库文件以进行链接。
   -Idirectory
       Add the specified directory to the search path for include files.
   -Fdirectory
       Add the specified directory to the search path for framework include files.

关于搜索行为,这些对应于Xcode中的项目或目标“构建设置”,称为Framework ~、Header ~和Library Search Paths。

是否希望将某些动态库链接到您的应用程序由“常规”设置“链接的框架和库”控制。

有关如何管理动态加载器(dyld)并使用@rpath@loader_path宏控制依赖库位置的更多信息,请参阅:https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/RunpathDependentLibraries.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接