当前位置: 首页 > 知识库问答 >
问题:

Swift 编译器错误:“框架模块内的非模块化标头”

谢麒
2023-03-14

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

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

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

似乎与模块功能有关,但目前还不清楚如何修复,你知道解决方案吗?

更新:

这是一个 Swift 编译器错误。

更新 2:

一个快速解决方法(但不能解决根本原因)是将以下设置设置为YES:CLANG _ ALLOW _ NON _ MODULAR _ INCLUDES _ IN _ FRAMEWORK _ MODULES = YES

共有3个答案

柴嘉年
2023-03-14

以下是如何自动应用快速修复,以便您不必更改Pods。xcodeproj在每次pod安装后手动执行。

将此代码片段添加到您的Podfile的末尾:

post_install do |installer|
  installer.pods_project.build_configuration_list.build_configurations.each do |configuration|
    configuration.build_settings['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES'
  end
end

冯宏浚
2023-03-14

这是预期的编译器行为,并且有一个很好的理由。

我认为大多数人遇到这个问题是因为他们从Application Target切换到Framework Target并开始将C和ObjectiveC标头添加到框架的伞形标头中,期望它具有与应用程序的桥接标头相同的行为,而桥接标头的行为不同。伞形标头实际上是为混合swift和obj-c框架指定的,其目的是将API暴露给您的框架在Objective-c或c中的外部世界。这意味着我们放在那里的标头应该在公共范围内。

它不应该用作向您的框架的swift代码公开不属于您的框架的Objective-C/C标头的地方。因为在这种情况下,这些头也将作为我们的框架模块的一部分暴露给外界,这通常不是我们想要做的,因为它破坏了模块化。(这就是为什么框架模块中允许非模块化包含默认为否)

为了向您的框架swift代码公开Objective-C/C库,我们应为该库定义一个单独的swift模块。那么可以使用标准的swift < code > import your legacy library 。

让我在一些典型的场景中演示一下:将< code>libxml2嵌入到我们的框架中。

1.您首先需要创建一个module.modulemap文件,该文件如下所示:

对于OSX框架:

module SwiftLibXML2 [system] {
  header "/usr/include/libxml2/libxml/xpath.h"
  export *
}

对于 iOS 框架:

module SwiftLibXML2 [system] {
  header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/libxml2/libxml/xpath.h"
  export *
}

它所做的只是将头和它在swift模块中引用的任何其他头包装起来,这样swift就可以为这些C接口生成swift绑定。

2. 然后在您的 xcode 项目目录中创建一个文件夹 SwiftLibXML2 并将此模块。

3. 在“生成设置”中,将 $(SDKROOT)/USR/包含/库xml2 添加到标头搜索路径

4.在构建设置中,将$(SRCROOT)/SwiftLibXML2添加到导入路径

5.在项目的“常规”选项卡下,将< code>libxml2.tbd添加到链接的框架和库。

现在您可以在需要的地方导入此模块:

import SwiftLibXML2

(如果你想看一个更完整的module.map例子,我建议参考达尔文的module.modulemap/usr/include/module.modulemap,你需要安装Xcode命令行工具才能到达那里,参考OS X El Capitan中的缺失 /usr/include)

胡和煦
2023-03-14

你的头是公开的吗?

在项目资源管理器中选择头文件。然后在xcode右侧的部分中,您会注意到目标旁边有一个下拉列表。将其从“项目”更改为“公共”。这对我有用。

 类似资料:
  • 问题内容: 现在,我想将我的ObjC框架迁移到Swift,并遇到以下错误: 引用指向仅定义协议的头文件,我在某些类中使用此头文件来使用此协议。 似乎与模块功能有关,但目前尚不清楚如何解决,您知道解决方案吗? 更新: 这是Swift编译器错误。 更新2: 一种快速解决方案(但不能解决根本原因)是将以下设置设置为yes:CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAME

  • 随着互联网的飞速发展,前端开发越来越复杂,导致开发经常出现两个问题: 恼人的命名冲突 烦琐的文件依赖 针对这两个问题,可以使用js模块化技术来解决。当前主流的js模块化有两大规范CMD(Seajs)和AMD规范(RequireJS)。WeX5采用RequireJS(AMD规范)来实现,关于RequireJS的详细说明参考:http://www.requirejs.org/ 接下来我们介绍在WeX5

  • 我只在Spring Boot项目中使用IntelliJ IDE。请注意,我没有使用任何Kotlin项目。但是,今天,我在下面有一个错误。任何专业人士。请帮忙解决这个问题!谢谢,错误:Kotlin:模块是用不兼容的Kotlin版本编译的。其元数据的二进制版本为1.5.1,预期版本为1.1.13。

  • 问题内容: 我有一个使用Xcode 10.3构建的VoiceSampler.framework 我正在尝试在新项目的Xcode11中使用该框架。我已经成功添加了该框架,但是当我用AppDelegate 编写时,出现以下错误: 使用Swift 5.0.1编译的模块无法由Swift 5.1编译器导入:/Users/apple/Projects/CaptureAppSwift/VoiceSampler.

  • 问题内容: 我正在尝试按照指令https://github.com/Paytm- Payments/Paytm_iOS_App_Kit/tree/master/Swift/BitCodeDisabled/PaytmNativeSDK将 第三方应用程序集成到项目中 我在构建中看到以下错误 Swift 5.0编译器无法导入使用Swift 4.2.1编译的模块 我尝试了工具链https://medium

  • 本文向大家介绍说明模块化自动化框架。,包括了说明模块化自动化框架。的使用技巧和注意事项,需要的朋友参考一下 在模块化自动化框架中,通过将整个应用程序划分为几个小的自给自足的模块,在模块或集群的基础上开发测试脚本。因此,创建了属于特定模块或集群的各个测试脚本。 属于这些隔离模块的这些脚本可以集成,并且可以由主驱动程序脚本驱动,以在模块之间执行集成测试。所有这些都是在开发模块脚本时使用的通用功能库(包