Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 我可以在另一个框架中包含一个框架吗?_Objective C_Cocoa_Xcode_Frameworks - Fatal编程技术网

Objective c 我可以在另一个框架中包含一个框架吗?

Objective c 我可以在另一个框架中包含一个框架吗?,objective-c,cocoa,xcode,frameworks,Objective C,Cocoa,Xcode,Frameworks,我正在编写一个框架(称为Lighthouse.framework),它反过来使用另一个框架(确切地说是RegexKit.framework)的代码。我已将RegexKit.framework复制到我自己的框架中,使其具有如下结构: Lighthouse.framework/ Versions/ A/ Frameworks/ RegexKit.framework Lighthouse 但是,当我尝试运行使用Lighthouse.framewor

我正在编写一个框架(称为Lighthouse.framework),它反过来使用另一个框架(确切地说是RegexKit.framework)的代码。我已将RegexKit.framework复制到我自己的框架中,使其具有如下结构:

Lighthouse.framework/
  Versions/
    A/
      Frameworks/
        RegexKit.framework
      Lighthouse
但是,当我尝试运行使用Lighthouse.framework(我的框架)的应用程序时,会出现以下错误:

dyld:未加载库:@executable_path/。/Frameworks/RegexKit.framework/Versions/A/RegexKit

引用自:/Users/mdippery/Developer/Projects/Current/lighthouse/build/Debug/lighthouse.framework/Versions/A/lighthouse

原因:找不到图像

显然,加载程序找不到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)
我可以在另一个框架中包含一个框架吗?这是正确的方法吗?如何解决我的错误?

是的,你可以

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


如果我没记错的话,XCode中的相关设置是“安装目录”和“框架安装名称”。后者可能对您的使用并不重要,但您需要将前者大致如下:
@executable\u path/./Frameworks/Lighthouse.framework/Versions/A/Frameworks/RegexKit.framework/Versions/A/
最简单的方法是使用@rpath。您的配置应该如下所示:

  • 将RegExKit.framework的安装目录设置为@rpath
  • 将Lighthouse.frameworks的安装目录设置为@rpath
  • 将Lighthouse.framework的运行路径搜索路径设置为@loader\u path/Frameworks
  • 确保将RegExKit.framework复制到Lighthouse.framework的framework子文件夹中(为此使用自定义构建阶段)

  • 最后,任何链接到Lighthouse.framework的应用程序都应该将运行路径搜索路径设置为@loader\u path/。/Frameworks

    我发现了解决此问题的方法。我从斯博思的回答中吸收了一些想法,但解决方法更简单。我运行了以下脚本:

    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\u path/./
    更改为
    @loader\u path/
    ,一切正常。

    在构建Lighthouse.framework(用于Lighthouse.framework)时是否设置了安装目录?我尝试了一下,但没有成功(尽管可能是我做错了什么)。@mipadi:如果你没有构建
    RegExKit.framework
    ,你将无法做到这一点。为什么要将RegExKit包含在另一个框架中?如果我的框架的使用者只需要包括我的框架,而不包括我的框架的依赖项,那就太好了。我不是在构建RegexKit.framework(我使用的是预编译的二进制文件)。我仍然可以为它设置安装目录吗(我没有看到这样做的方法)?您可以使用install\u name\u工具进行此操作-类似install\u name\u工具-change@executable\u path/。/Frameworks@rpath/Frameworks这是如何在另一个框架中包含框架的方法。它被称为伞形框架。您在哪里设置此构建脚本的可能副本?在框架产品上还是在聚合产品上?