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

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

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

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

更新:

这是一个Swift编译器错误。

更新2:

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


当前回答

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

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

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

其他回答

对我来说,解决方案是去目标->构建设置->允许框架模块中的非模块化包含切换到YES!

这个答案已经过时了。

导入框架时,必须导入所有与根头文件共享依赖关系的头文件。确保这总是有效的最简单的方法是导入框架的“headers”文件夹中的所有头文件到你的公共头文件路径。

Swift编译器使用这些信息生成一个非破损符号的映射及其相关的类型信息。

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

我尝试了我在这个线程上找到的所有可能的解决方案,设置目标->构建设置->允许框架模块中的非模块化包含切换到YES!等等。

但是什么都不管用。

当我通过评论use_frameworks安装pods时,我开始得到这个错误!,因为我想有一个静态库的豆荚。

原因Swift编译器抛出(在Xcode 13)这个错误,因为我正在导入私有框架头#导入“TFLTensorFlowLite.h” 在公共.h文件中,所以我在.m文件中导入了它,如下面的截图所示,它停止了Swift编译器抛出这个错误(注意我的框架有Objective c和Swift代码)

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