我可以在另一个框架中包含框架吗?
我正在编写一个框架(称为Lighthouse.framework),该框架反过来使用来自另一个框架(RegexKit.framework,准确地说)的代码。我抄RegexKit.framework到我自己的框架,因此,它具有如下所示的结构:我可以在另一个框架中包含框架吗?
Lighthouse.framework/
Versions/
A/
Frameworks/
RegexKit.framework
Lighthouse
然而,当我尝试运行使用Lighthouse.framework(我的架构)的应用程序,我得到的以下错误:
dyld: Library not loaded: @executable_path/../Frameworks/RegexKit.framework/Versions/A/RegexKit
Referenced from: /Users/mdippery/Developer/Projects/Current/lighthouse/build/Debug/Lighthouse.framework/Versions/A/Lighthouse
Reason: image not found
显然,加载程序没有找到RegexKit。
我这里还有装载机希望加载路径,礼貌otool
:
build/Debug/Lighthouse.framework/Versions/A/Lighthouse:
/Users/mdippery/Library/Frameworks/Lighthouse.framework/Versions/A/Lighthouse (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 12.0.0)
@executable_path/../Frameworks/RegexKit.framework/Versions/A/RegexKit (compatibility version 0.4.0, current version 0.6.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 476.19.0)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 677.26.0)
我可以在另一个框架的框架?这是做到这一点的正确方法吗?我该如何解决我的错误?
我发现了此问题的修复程序。我从sbooth的回答中收集了一些想法,但修复更简单。我运行了这个脚本:
install_name_tool -change @executable_path/../Frameworks/RegexKit.framework/Versions/A/RegexKit @loader_path/Frameworks/RegexKit.framework/Versions/A/RegexKit "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.framework/Versions/A/${PRODUCT_NAME}"
作为运行构建脚本阶段。
请注意,对于一般情况,您必须将@executable_path/../
更改为@loader_path/
,并且一切正常。
您在哪里设置了这个构建脚本?在框架产品或总产品? – 2016-01-28 12:00:00
是的,你可以。但是,您需要包含的框架来“知道”它在安装位置时的安装位置;否则,如您所见,dyld
将无法在运行时找到它。
如果我正确记得,XCode中的相关设置是“安装目录”和“框架安装名称”。后者可能对你的使用没有任何影响,但你需要前者是沿着以下几点:@executable_path/../Frameworks/Lighthouse.framework/Versions/A/Frameworks/RegexKit.framework/Versions/A/
最简单的方法是使用@rpath。你的配置应该是这样的:
- 集RegExKit.framework的安装目录,以@rpath
- 集Lighthouse.frameworks的安装目录,以@rpath
- 集Lighthouse.framework的运行路径搜索路径,以@ loader_path /框架
- 确保将RegExKit.framework复制到Lighthouse.framework的框架子文件夹中(对此使用自定义构建阶段)
最后,任何应用程序链接g到Lighthouse.framework应设置运行路径搜索路径到@loader_path /../框架
下面是如何在另一个框架中包含框架。 http://stackoverflow.com/a/27638841/1582217它被称为伞架。 – 2014-12-24 16:21:09
[如何在iOS sdk中创建Umbrella框架?](http://stackoverflow.com/questions/27484997/how-to-create-an-umbrella-framework-in-ios-sdk) – 2014-12-25 08:00:32