我有一组项目,我正在编译为动态库。这些.dylib中的每一个都依赖于我想放在其他各种目录中的其他各种.dylib(即一些在可执行路径中,一些在加载器路径上,一些在固定路径上)。
当我在已编译的库上运行otool -L
时,我会获得这些依赖项的路径列表,但我知道如何设置/确定这些路径。它们几乎都是伪随机的。我花了几个小时搞乱Xcode中的“Build Settings”来尝试更改这些路径(w / @ apt,@ executable_path,@ download_path等),但我似乎无法改变任何东西(通过运行{检查} {1}})。我甚至不完全确定在哪里添加这些标志,并且不太了解以下内容之间的区别或如何正确使用它们:
链接 - “动态库安装名称”
链接 - “Runpath搜索路径”
链接 - “其他连接标志”
搜索路径 - “图书馆搜索路径”
当我在各个库上运行otool -L
时,我能够成功更改运行路径搜索路径(再次通过运行install_name_tool -change
进行验证来确认)。
我正在运行Xcode 4.2,我非常接近放弃,只是使用运行install_tool_name的后期构建脚本来进行更改。但它是一个kludge hack修复,我宁愿不这样做。
在哪里可以看到如何设置dylib依赖项的搜索/运行路径? 任何人对我可能做错了什么都有任何想法?
答案 0 :(得分:12)
通常,在我的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
向您展示的内容。
一旦你有条理,尝试让dylib相互链接。它应该更直接。