我有一组项目正在编译为动态库。这些 .dylib 中的每一个都依赖于我想放置在各个其他目录中的其他各种 .dylib(即一些位于可执行路径,一些位于加载器路径,一些位于固定路径)。
当我在编译的库上运行otool -L
时,我得到了这些依赖项的路径列表,但我知道这些路径是如何设置/确定的。它们几乎看起来是伪随机的。我花了几个小时搞乱 Xcode 中的“build设置”,尝试更改这些路径(w/@rpath、@executable_path、@loader_path 等),但我似乎无法更改任何内容(通过运行 otool -L
)。我什至不完全确定在哪里添加这些标志,并且并不真正理解以下内容之间的区别或如何正确使用它们:
链接 - “动态库安装名称”
链接 - “运行路径搜索路径”
链接 - “其他链接标志”
搜索路径 - “库搜索路径”
当我在各个库上运行 install_name_tool -change
时,我能够成功更改运行路径搜索路径(再次通过运行 otool -L
进行验证以确认)。
我正在运行 Xcode 4.2,我非常接近放弃,只是使用运行 install_tool_name 的构建后脚本来进行更改。但这是一个拼凑的黑客修复程序,我不想这样做。
在哪里可以看到 dylib 依赖项的搜索/运行路径是如何设置的?
有人对我可能做错了什么有任何想法吗?
最佳答案
通常,在我的 dylib 目标中,我将 INSTALL_PATH
又名“安装目录”设置为我想要的前缀(例如 @executable_path/../Frameworks
)。
我将LD_DYLIB_INSTALL_NAME
(又名“动态库安装名称”)设置为其默认值,即$(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)
。
Xcode 根据您的目标名称进行扩展,因此它最终可能会是 @executable_path/../Frameworks/MyFramework.framework/Versions/A/MyFramework
,例如。
要认识到的重要一点是,安装路径内置到dylib中,作为其构建过程的一部分。稍后,当您链接引用 A.dylib 的 B.dylib 时,A.dylib 的安装路径将复制到 B.dylib 中。 (这就是 otool
向您展示的内容——那些复制的安装路径。)因此,最好首先将正确的安装路径内置到 dylib 中。
在尝试让所有 dylib 一起工作之前,请单独检查每个 dylib。构建它,然后在构建的 dylib 上使用 otool -L
。每个架构的第一行应该是 LD_DYLIB_INSTALL_NAME
向您展示的内容。
一旦你组织好了,尝试让 dylibs 相互链接。它应该更简单。
关于xcode - 如何正确设置运行路径、搜索路径和安装名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9798623/