xcode 找不到目标的伞状标头,将不生成模块Map

58wvjzkj  于 2022-12-19  发布在  其他
关注(0)|答案(5)|浏览(196)

当我尝试在Xcode 6.3中将CKCountdownButton构建为框架时,它抱怨

警告:找不到目标“CKCountdownButton”的伞状标头,将不生成模块Map

然后,当我在其他项目中导入此框架时,它失败了,并显示No such module 'CKCountdownButton'

dohp0rv5

dohp0rv51#

我找到了另一个解决方案,Xcode提供了一种通过Module Map File配置来指定伞形头的方法。

module.modulemap的内容应为:

framework module Foo {
    umbrella header "Bar.h"

    header "other-header.h"

    export *
    module * { export * }
}
mrzz3bfm

mrzz3bfm2#

在框架中添加CKCountdownButton.h解决了此问题。
我认为伞形头文件是指与Framework同名的头文件

gmxoilav

gmxoilav3#

该目标需要至少有1个Swift文件。请检查您是否已将Swift文件添加到目标

uhry853o

uhry853o4#

    • 自定义框架模块Map(. modulemap)和定义模块(DEFINES_MODULE)**

Module and .modulemap(https://stackoverflow.com/a/59213694/4770877)
公共文件结构:

header_1
  header_1_1
header_2

将所有应向使用者公开的标头标记为公共(header_1.h、header_2.h、header1_1.h)。Headerspublic部分About(https://stackoverflow.com/a/57511627/4770877),否则将出现下一个错误。

//For example in umbrella.h
Include of non-modular header inside framework module '<module_name>'

//or in upper .h file
'PBURLConnectionStub.h' file not found

包含在.modulemap中的modular headers-.h文件:

  • umbrella.h中的. modulemap umbrella关键字
  • .模块Mapheader关键字。

模块化标头可以导入模块化标头
创建一个umbrella file-任何.h文件(或为Framework目标自动生成的<product_name>.h)。
将根.h文件添加到umbrella fileUmbrella.h)。将自动添加从此文件导入的所有内容

//Umbrella.h file
#import "header_1.h"
#import "header_2.h"

使用或创建一个自定义的.modulemap文件。您可以根据需要调用.modulemap文件,编译后它将被称为module.modulemap。此外,我不建议您将其称为module.modulemap,因为它可能会导致此文件的不可预测的更改
module.modulemap,默认生成:

//the same for Objective-C and Swift framework
framework module SomeModule {

    //umbrella header "<umbrella_name>.h"
    umbrella header "Umbrella.h"
  
    export *
    module * { export * }
}

//unique for Swift framework
module SomeModule.Swift {
    header "SomeModule-Swift.h"
    requires objc
}
    • 一米十九寸**

递归地公开allmodule headers。生成下一个代码

//.modulemap
framework module SomeModule {
    //explicitly define all modular header
    header "header_1.h"
    header "header_2.h"
    header "header_1_1.h"
}

//using
import SomeModule

header_1
header_2
header_1_1
    • 多个模块**

. modulemap可以包含多个模块。其中一个必须与PRODUCT_MODULE_NAME同名

//.modulemap
framework module SomeModule
framework module SomeModule2

//using
import SomeModule
import SomeModule2

子模块module**
当您导入外部模块时,您可以使用子模块中的标题

//.modulemap
framework module SomeModule {
    module Submodule1 {
        header "header_1.h"
    }
}

//using
import SomeModuleSwift.Submodule1
//or even
import SomeModuleSwift

//availability
header_1
    • 显式子模块explicit module**

您不能使用模块名称作为子模块标题(如前一个示例所示,默认情况下您可以这样做)

//.modulemap
framework module SomeModule {
    explicit module Submodule1 {
        header "header_1.h"
    }
}

//using
//import SomeModuleSwift //Error: Cannot find 'header_1' in scope
import SomeModuleSwift.Submodule1

//availability
header_1
    • 显式子模块export之间的依赖关系**
//.modulemap
framework module SomeModule {
  explicit module Submodule1 {
      header "header_1.h"
      export Submodule2
  }
  explicit module Submodule2 {
      header "header_2.h"
  }
}

//using
import SomeModuleObjC.Submodule1

//availability
header_1
header_2
    • 使用保护伞**

module *仅适用于**umbrella**,如果不适用,您将获得

Inferred submodules require a module with an umbrella
//.modulemap
framework module SomeModule {
  umbrella header "Umbrella.h"

  module * { export * }
  export *

生成下一个代码

framework module SomeModule {

  //module * { export * }
  module header_1 {
    header "header_1.h"

    export header_2 
    export header_1_1 
  }

  module header_2 {
    header "header_2.h"
    
    export header_1 
    export header_1_1 
  }

  module header_1_1 {
    header "header_1_1.h"
    
    export header_1 
    export header_2 
  }

  //export *
  export header_1 
  export header_2 
  export header_1_1 
}

//using one of them
import SomeModule.header_1 
//or 
import SomeModule.header_2
//or
import SomeModule.header_1_1 
//or
SomeModule

//availability
header_1
header_2
header_1_1

当一些文件找不到下一个错误发生

Error: Cannot find 'header_name' in scope

使用explicit module查看效果
module *-为umbrella中的每个modular header创建子模块
export *-将所有子模块导出到当前子/模块
如果我们使用module * { }而不是module * { export * }import SomeModule.header_1,没有任何变化,我们可以在导入单个子模块时使用所有modular headers。这是安全的,因为父模块SomeModule可以访问所有子模块

import SomeModule.header_1

header_1
header_2
header_1_1

如果使用explicit module * { }而不是explicit module * { export * }import SomeModule.header_1,则会出现错误

import SomeModule.header_1

header_1
//header_2 //Error: Cannot find 'header_2' in scope

制作人:

    • 定义模块(DEFINES_MODULE)**
Build Settings -> Defines Module
If YES - Xcode generates .modulemap. If `MODULEMAP_FILE` is not specified Xcode try to generate it automatically
    • 模块Map文件(MODULEMAP_FILE)**
Build Settings -> Module Map File
Path to custom `.modulemap` file
The result file `module.modulemap` will be generated and embedded into .framework

消费者:

    • 导入路径(SWIFT_INCLUDE_PATHS)**
Build Settings -> Import Paths
Path to custom `.modulemap` file
1qczuiv0

1qczuiv05#

我有同样的问题与'GoogleToolbox'。它发生在当我试图更新我的pod repo和一些错误发生。只是做了'pod安装'从终端上的项目文件夹和一切都得到了确定。

相关问题