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

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

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

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

更新:

这是一个Swift编译器错误。

更新2:

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


当前回答

我有Facebook 4.02 sdk和FBSDKCoreKit的具体问题。

我做了所有的步骤,但仍然错误关于非模块化头。我只从框架中拖放特定的头以构建阶段->头节。

然后在顶部的项目导航器上自动创建标题的副本。

我从构建阶段->头文件中删除了它,并删除了新文件,工作正常。

好像它被重置了。

其他回答

Most commonly this error is caused by the chosen answer, yet I had this error appear once by accident when dragging framework files into my new project folder. I clicked to delete the frameworks but accidentally pressed to only 'Remove Reference' to the frameworks rather than to actually delete the files completely. At this point if I opened my project folder in Finder I saw files like 'CoreLocation' and 'AudioToolbox' there. Deleting these files from the project folder and cleaning the project fixed the issue.

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

我解决了它从框架中删除模块文件夹。

使用finder浏览到应用程序项目中显示的框架位置 进入Test.framework文件夹(在上面的例子中,它将是SOGraphDB.framework) &删除模块文件夹。 清洁和重新构建应用程序,它将解决问题。

在允许导入非模块化include之后,你可以尝试使用Objective-C Bridging头文件导入该模块:

#import <YandexMobileMetrica/YandexMobileMetrica.h>

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

总结一下:

@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.

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