【问题标题】:Umbrella Header Not Found When Changing Target Name or Product Name of Framework更改框架的目标名称或产品名称时找不到伞头
【发布时间】:2023-03-14 05:10:01
【问题描述】:

我有这个代码库,我决定将它变成一个框架,以便在我未来的应用程序中重用。

所以我继续为 Cocoa Touch 框架创建了一个 Xcode 项目。

为了简单起见(至少在我掌握框架的基础知识之前不考虑工作区),我创建了一个“测试床”iOS 应用程序,它嵌入/依赖/链接到框架作为 附加目标到同一个项目(不是一个单独的项目)。当然,这个想法是在我添加或修改框架时使用这个应用程序来测试我的框架功能。

所以我的项目有两个目标:

  • 我的框架
  • MyTestApp

...当然还有两个方案(每个构建一个):

我还在修改代码,使其在 iOS 和 macOS 上都可以使用。 警告:找不到目标“MyFramework (macOS)”的伞头,不会生成模块映射。

到目前为止,一切都很好。

此外,我还修改了代码,使其在 iOS 和 macOS 上都可以使用。

所以我又添加了两个目标:

  • MyFrameworkMac
  • MyTestMacApp

...aslo 设置,以便应用程序目标依赖、链接和嵌入框架。

还是不错的。

接下来,我决定进行一些清理和文件重新排列,以便在文件数量开始进一步增长之前保持整洁和合理。

然后,麻烦就开始了。

经过反复试验,我发现了一些事情:

1) 如果我更改 iOS 框架的目标名称并尝试构建 iOS 应用程序,我会收到以下警告:

/Users/Me/Projects/MyFramework/Code/MyFramework/:1:1: 模块“MyFramework”的伞头不包括标题 'PublicHeaderXX.h'

...对于我的主标头中包含的每个公共标头:

    // In this header, you should import all the public headers of your framework
    // using statements like #import <MyFramework/PublicHeader.h>

    #import <MyFramework/PublicHeader01.h>
    #import <MyFramework/PublicHeader02.h>
    #import <MyFramework/PublicHeader03.h>
    ...

2) 如果我在 Build Settings 中更改 iOS 框架的 产品名称,我会收到错误:

词法或预处理器问题 | 'MyFramework/MyFramework.h' 文件未找到

...指向我在应用源代码中导入它的位置:

    #import <MyFramework/MyFramework.h>

对于 Mac 框架目标,我可以更改目标名称,但如果我更改产品名称,我会收到警告:

警告:没有为目标“MyFrameworkMacRenamed”找到伞头, 不会生成模块图

所以我问...

有没有办法为每个框架目标设置我想要的目标名称和产品名称?

我确定在某个地方我应该“修改以匹配”并消除一些差异,但我是框架的新手,无法弄清楚......(什么是“伞形标题”无论如何?)

【问题讨论】:

    标签: ios objective-c xcode cocoa frameworks


    【解决方案1】:

    事实证明,“伞形标头”只不过是 Xcode 在您首次创建项目或框架目标时自动创建的框架的“主”标头,它必须与目标(如解释,例如here)。

    至于为什么 both 目标 产品必须我命名相同,我只能猜测这与保持链接不太复杂有关(应用程序未链接反对',所以我想产品名称是你想要的任何东西都没有损害)。

    我试图用一个单一标题来统治它们(平台),使用 TargetConditionals.h 等来导入 Cocoa.h 或 UIKit.h,这是不可能的,因为Xcode 不会让你对两个目标使用相同的名称,并且它们必须匹配它们的标头名称!

    所以,我选择了:

    • &lt;MyFramework/MyFramework.h&gt;经典。不接受替代品。 iOS 独有,以及

    • &lt;MyFrameworkMac/MyFrameworkMac.h&gt;: 现在也可以在 Mac 上使用了! - 来自为您带来 MyFramework 的人

    【讨论】:

      【解决方案2】:

      我做了很多阅读和尝试。我的解决方案是结合:

      1. 干净的构建
      2. 关闭 Xcode
      3. 在任何地方删除 DerivedData - 在项目文件夹、用户文件夹 (~/Library/Developer/Xcode) 和根文件夹中 /图书馆/开发者/...
      4. 打开 Xcode 并再次清理
      5. 从测试设备中删除应用

      现在可以了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-09
        • 2011-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多