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

Big*_*ack 13 macos xcode dylib dyld xcode4.2

我有一组项目,我正在编译为动态库.这些.dylib中的每一个都依赖于我想要放置在各种其他目录中的其他各种.dylib(即一些在可执行路径中,一些在加载器路径中,一些在固定路径上).

当我运行otool -L已编译的库时,我得到了这些依赖项的路径列表,但我知道如何设置/确定这些路径.它们几乎都是伪随机的.我花了几个小时搞乱Xcode中的"Build Settings"来尝试更改这些路径(w/@ apath,@ executable_path,@ download_path等),但我似乎无法改变任何东西(通过运行检查otool -L) .我甚至不完全确定在哪里添加这些标志并且不能真正理解以下内容之间的区别或如何正确使用它们:

链接 - "动态库安装名称"
链接 - "运行路径搜索路径"
链接 - "其他链接标志"
搜索路径 - "库搜索路径"

当我运行install_name_tool -change各种库时,我能够成功更改运行路径搜索路径(再次通过运行otool -L确认验证).

我正在运行Xcode 4.2,我非常接近放弃,只是使用运行install_tool_name的后期构建脚本来进行更改.但它是一个kludge hack修复,我宁愿不这样做.

在哪里可以看到如何设置dylib依赖项的搜索/运行路径?
任何人对我可能做错了什么都有任何想法?

Kur*_*vis 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.构建它,然后otool -L在构建的dylib上.每个架构的第一行应该LD_DYLIB_INSTALL_NAME是向您展示的内容.

一旦你有条理,尝试让dylib相互链接.它应该更加直截了当.

  • 虽然不是我想要的确切答案,但这有助于我找出问题所在.`otool -L`列出了所有的安装名称.列出的第一个"安装名称"是库本身的名称.列出的任何其他路径都是针对其依赖项的.假设您已从源代码编译了依赖项,在Xcode中设置"动态库安装名称"将正确设置这些路径.但是在我的情况下,依赖关系来自第三方,所以路径已经设置好了.由于我无法控制第三方库的编译,因此我不得不使用`install_name_tool -change`. (3认同)