@import导致解析问题:“无法构建模块”

37

在更新了Xcode 6.3之后,我发现我的项目出现了一些奇怪的问题。

下面的代码导致解析问题,显示“Could not build module 'AgendaFramework'”,其中AgendaFramework是我为ios8定制的嵌入式框架:

@import MyEmbededFramework;

错误标记看起来像这样:

error

问题是在索引而不是构建期间引发的。整个构建可以成功执行,没有任何错误或警告。我可以构建、归档、在设备上运行、部署、提交到应用商店。

然而,当我编辑属于扩展的类时,错误标记会出现。该扩展(widget)明确链接到嵌入式框架。(我知道当我使用@import语句时,不必这样做。)

在这种状态下,我无法接收到任何有效的内容助手,非常烦人。

在我用旧风格替换导入语句之后,问题消失了:

#import <AgendaFramework/AgendaFramework.h>

我有几个其它项目与这个导致问题的项目拓扑非常相似,但它们没有问题。只有一个项目导致了这个问题。我比较了每个细节的构建设置,但是没有发现任何线索。

我尝试过:

  • 删除派生数据
  • 完全清除
  • 重新启动

欢迎提供任何线索。谢谢!


1
它仍然可以与构建一起工作。问题只在实时索引时发生。 - jeeeyul
3
清除构建文件夹(CMD+Option+Shift+K)和删除派生数据文件夹,重启Xcode,重启Mac。 - Fab1n
问题似乎在6.4版本中仍然存在 :( - Mihai Timar
2
我也遇到了同样的问题。使用 #import <Framework/Framework.h> 可以工作,但是使用 @import Framework; 会说无法构建模块。有趣的是,该项目确实可以成功构建和运行;错误消息总是在构建后出现。 - rvijay007
2
我将我的框架放在主.xcodeproj文件的子文件夹中。我之前使用该子文件夹来存储所有第三方框架,并在设置中递归地添加了该搜索路径,因此我不必为每个添加的框架搞很多额外的搜索路径。但是,一些情况下@import无法正常工作,所以我将框架添加到与.xcodeproj文件相同的文件夹中,没有子文件夹或其他任何东西。然后一切都开始正常工作了,没有问题。 - Jonny
显示剩余3条评论
8个回答

32

看起来,开启: 允许在框架模块中使用非模块化包含 对我解决了这个问题。


3
在具体情况下,这种方法有时有效,有时无效。 - jeeeyul
允许非模块化包含 = 是,如何实现它?我也遇到了同样的问题,请支持我。 - vualoaithu
1
天啊,在Xcode设置中,这被评为双倍模糊不清...四处寻找,最终在目标 > 构建设置 > 所有 > 组合 > 允许框架模块中的非模块化包含中找到了。Xcode是一款糟糕的软件。更糟糕的是,它还没有起作用。 - Cerniuk

4

你好,这是因为你将一个需要在框架头部公开的文件也必须是公开的。

将"项目"改为"公共"


这就是方法。 - Jared Updike

3
有时,这个问题可以通过将框架添加到与.xcodeproj文件相同的文件夹中来解决,不要创建子文件夹或其他任何东西。
感谢Jonny在评论中指出了这一点。

1
这是一种丑陋的方式,但对我有效。找不到更好的方法。如果您找到更好的方法,请更新此线程。 - user550088

1

对我有用的解决方案:在框架头文件定位到系统样式导入时要勤奋,例如#import <CoreXLib/CoreThreads.h>。 故事如下:

在我的情况下,我构建的框架来自于几个代码库的组合,因为通过框架可以更轻松地重用一些通用设计模式,而不是脆弱的Xcode项目路径。

当我构建我的框架“CoreXLib”时,我将其重新组织为Xcode典型的Cocoa框架。 我从以下导入中进行了更改:

    #import "CoreTypeAliases.h"    // project local style   

    #import <CoreXLib/CoreTypeAliases.h>    // system or framework style

适当地。使用包含lego文件夹中公共头文件的CoreXLib.framework的几个项目工作正常...所以我认为一切都很顺利...

不幸的是,某些公共头文件没有得到完全更新。框架中的类在本地样式下构建得很好。所有使用它的项目都可以工作,直到我遇到了一个问题...由@jeeeyul指出的错误。

因此,在找到这个线程并找到@kwz的解决方案后,在我的情况下没有做任何事情,我决定在尝试解决这个问题时将代码进行优化。在优化过程中,我发现一些#imports没有像Xcode搜索和替换应该改变的那样改变。需要手动修改...

在修复了我所有CoreXLib项目头文件中的所有引用(不仅仅是公共的,自卫)之后,我重新开始解决问题......我将新编译的CoreXLib.framework带到了那个嵌入它的错误项目中......问题已经消失了!我在框架项目和链接框架的项目中都检查了“允许非模块化包含......”,两者都是“否”。在多次测试中,将两者都翻转为“Yes”和“No”并没有任何区别。唯一的其他更改是将“#import "..."”更改为“#import <CoreXLib/...>”。
所以有时候打磨苹果可以去除虫子......

1
在构建设置中的仅编译活动架构中设置为YES。 这对我有效。

enter image description here


你解决了我的问题。我已经试图弄清楚这个问题超过7个小时了。谢谢。 - MoMo

0

你可以尝试这个方法,对我很有效。删除与你的项目相关的DerivedData目录。按步骤操作


0
今天我通过以下步骤解决了这个问题:
  1. 选择模式“ MyEmbededFramework”
  2. 按下 [Command + B] 进行构建
  3. 从构建阶段面板中,将“MyEmbededFramework.framework”添加到链接二进制文件库中
尝试构建您的项目,问题现在可能已经消失了。

-11

在构建设置中关闭模块,这可能会起作用。


1
你可以详细解释一下吗?我制作了一个模块(框架),并使用了模块化导入语句。所以我认为这没有意义。 - jeeeyul
只需尝试进入构建设置,搜索模块并将其关闭即可。 - user2918201

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接