2010-08-18 93 views
8

我正在编写一个框架(称为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) 

我可以在另一个框架的框架?这是做到这一点的正确方法吗?我该如何解决我的错误?

+0

下面是如何在另一个框架中包含框架。 http://stackoverflow.com/a/27638841/1582217它被称为伞架。 – 2014-12-24 16:21:09

+0

[如何在iOS sdk中创建Umbrella框架?](http://stackoverflow.com/questions/27484997/how-to-create-an-umbrella-framework-in-ios-sdk) – 2014-12-25 08:00:32

回答

1

我发现了此问题的修复程序。我从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/,并且一切正常。

+0

您在哪里设置了这个构建脚本?在框架产品或总产品? – 2016-01-28 12:00:00

1

是的,你可以。但是,您需要包含的框架来“知道”它在安装位置时的安装位置;否则,如您所见,dyld将无法​​在运行时找到它。

如果我正确记得,XCode中的相关设置是“安装目录”和“框架安装名称”。后者可能对你的使用没有任何影响,但你需要前者是沿着以下几点:@executable_path/../Frameworks/Lighthouse.framework/Versions/A/Frameworks/RegexKit.framework/Versions/A/

+0

在构建Lighthouse.framework(用于Lighthouse.framework)时设置安装目录?我试了一下,但没有奏效(虽然也许我做错了)。 – mipadi 2010-08-19 15:12:06

+0

@mipadi:如果你没有构建'RegExKit.framework',你将无法做到这一点。为什么要将RegExKit包含在其他框架中?没有这个,你正在做的事情会很好。 – 2010-08-19 16:05:10

+0

如果我的框架的消费者只需要包含我的框架,而不是包含我的框架的依赖关系,那将会很好。 – mipadi 2010-08-19 16:10:15

8

最简单的方法是使用@rpath。你的配置应该是这样的:

  1. 集RegExKit.framework的安装目录,以@rpath
  2. 集Lighthouse.frameworks的安装目录,以@rpath
  3. 集Lighthouse.framework的运行路径搜索路径,以@ loader_path /框架
  4. 确保将RegExKit.framework复制到Lighthouse.framework的框架子文件夹中(对此使用自定义构建阶段)

最后,任何应用程序链接g到Lighthouse.framework应设置运行路径搜索路径到@loader_path /../框架

+0

我没有构建RegexKit.framework(我正在使用预编译的二进制文件)。我是否仍然可以为其设置安装目录(我没有看到这样做的方法)? – mipadi 2010-08-19 15:12:58

+1

您可以使用install_name_tool来实现此目的 - 比如install_name_tool -change @executable_path /../ Frameworks @ rpath/Frameworks – sbooth 2010-08-20 00:37:07

相关问题