xcode - 如何正确设置运行路径、搜索路径和安装名称?

标签 xcode macos xcode4.2 dylib dyld

我有一组项目正在编译为动态库。这些 .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/

相关文章:

objective-c - 为什么这不起作用? - 将数据写入plist

iphone - 如何给 iPhone 联系人添加备注?

ios - SKReferenceNode 缩放后 Swift 碰撞不起作用

xcode - 从嵌套的 Swift 包访问 Assets 时,SwiftUI 预览会崩溃

objective-c - 检查 NSButton 是否在 drawRect 上关闭

ios - Xcode 4.5 项目警告 - "Upgrade Compiler configuration to LLVM"

ios - Apple Mach-O 链接器 (Id) 错误 .. "__objc_empty_cache",需要框架引用

ios - 如何从外部文件夹添加 xcode 框架?

xcode - 无法安装 - 找不到此可执行文件的有效配置文件 Xcode 11

java - libGDX 仅编译黑屏