代码之家  ›  专栏  ›  技术社区  ›  mipadi

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

  •  8
  • mipadi  · 技术社区  · 14 年前

    Lighthouse.framework/
      Versions/
        A/
          Frameworks/
            RegexKit.framework
          Lighthouse
    

    但是,当我尝试运行使用灯塔.框架(我的框架),我得到以下错误:

    dyld:未加载库:@executable\u path/./Frameworks/RegexKit.framework/Versions/A/RegexKit

    原因:找不到图像

    显然,加载程序没有找到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)
    

    我可以在另一个框架中包含一个框架吗?这是正确的方法吗?如何解决我的错误?

    3 回复  |  直到 14 年前
        1
  •  8
  •   sbooth    14 年前

    最简单的方法是使用@rpath。您的配置应该如下所示:

    1. 套RegExKit.framework的安装目录到@rpath
    2. 套灯塔.框架的运行路径搜索路径到@loader\u path/Frameworks
    3. 确保RegExKit.framework文件被复制到灯塔.框架的框架子文件夹(为此使用自定义生成阶段)

        2
  •  1
  •   Stephen Canon    14 年前

    是的,你可以。

    但是,您需要包含的框架来“知道”它在构建时的安装位置;否则, dyld

    如果我没记错的话,XCode中的相关设置是“Installation Directory”和“Framework Install Name”。后者对您的使用可能无关紧要,但您需要前者符合以下要求: @executable_path/../Frameworks/Lighthouse.framework/Versions/A/Frameworks/RegexKit.framework/Versions/A/

        3
  •  1
  •   mipadi    14 年前

    我找到了解决这个问题的方法。我从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/ ,一切都很好。