现在我想把我的ObjC框架迁移到Swift,我得到了以下错误:

include of non-modular header inside framework module 'SOGraphDB'

引用是一个头文件,它只是定义了一个协议,我在一些类中使用这个头文件来使用这个协议。

这似乎与模块特性有关,但目前不太清楚如何修复,你知道解决方案吗?

更新:

这是一个Swift编译器错误。

更新2:

一个快速的解决方法(但不能解决根本原因)是将以下设置设置为yes: clang_allow_non_modular_incles_in_framework_modules = yes


当前回答

导入Parse框架时遇到了这个问题。我能解决这个问题的唯一方法是放弃我上次提交后所做的所有更改(简单地删除框架并清理项目不起作用),并再次添加Parse(在重新下载SDK之后)及其所需的其他框架。

其他回答

头文件已分配给目标,但仅被标记为项目可见,只是更改为公共导致解决此错误。

你的头文件是公共的吗?

在项目资源管理器中选择头文件。然后在xcode右边的部分,你会注意到目标旁边有一个下拉菜单。把“项目”改成“公共”。这对我很管用。

允许框架模块中的非模块化包含为YES!为我解决了同样的问题。

我也想补充一下我在这个问题上的经验。

总结一下:

@ambientlight的回答很棒,它解决了大部分问题。 允许非模块化报头是另一种解决方案(参见上面的一些答案)。 将框架的头标记为公共的(只有那些您想要公开的),并将它们导入到伞形头中。

以下是我对上述答案的2个补充:

carefully check the imports in your project for headers which import your frameworks directly in them (instead of using forward declaration, if possible) -- it is not a good practice to include a header file inside another header file; sometimes this causes a problems, because if not done properly this may lead to multiple include-ing of one header and create linker issues. UPDATE: make sure that the architectures of the library and that of the target that you want to link it to match. and lastly, after doing all of the above, I still kept bumping onto that error. So I dug a little more and found (in the apple developer forums, but I lost the link :( ) that if you include the headers in the umbrella header not like this <framework/headerName.h>, but only like this "headerName.h", the problem goes away.

我尝试了最后一个,到目前为止我还没有遇到过这个问题,但是我怀疑这个解决方案只有在你应用了一些顶部的答案时才有效(注意:它们并不都相互兼容,例如,模块方法和允许非模块头包含)。

我想我解决了这个问题。我有一些在框架中使用sqlite3的模型代码。在我的例子中,罪魁祸首是<sqlite3.h>。

问题是在我的Module/Module.h头文件中,我导入了一个导入<sqlite3.h>的公共头文件。解决方案是隐藏所有sqlite3_xxx类型,并确保它们 没有出现在任何公共场所。所有对sqlite3的直接引用都是私有或项目可见性。例如,我有一个公共单例,它挂有一些sqlite3_stmt指针。我把它们移动到一个单独的类中,现在它只是一个公共报头中的前向声明。现在我可以建造了。

顺便说一句,clang_allow_non_modular_incles_in_framework_modules设置不起作用。我试着在框架和相关项目中都设置它。这种变通是必要的,尽管我不确定为什么。