在需要之前,必须从模块“yyy”导入“xxx”的定义

cot*_*ton 6 module objective-c clang

例如,我们有一个 pod 'Dependency3' 声明为 A 类

@interface A : NSObject

- (void)test;

@end
Run Code Online (Sandbox Code Playgroud)

pod 'Dependency1' 声明为 B 类和 A 类类别

@interface B : NSObject

@property (nonatomic, copy) NSString *bText;

@end

@interface A (Dep1)

@property (nonatomic, copy) NSString *aTextDep1;

@end
Run Code Online (Sandbox Code Playgroud)

pod 'Dependency2' 声明了 A 类和 B 类类别

@interface A (Dep2)

@property (nonatomic, copy) NSString *aTextDep2;

@end

@interface B (Dep2)

- (NSString *)bTextDep2;

@end
Run Code Online (Sandbox Code Playgroud)

并且依赖关系没有问题:

Dependency2 -> Dependency3 & Dependency1
Dependency1 -> Denpendency3
Run Code Online (Sandbox Code Playgroud)

在podfile中,我们启用其中一些的modular_headers

  pod 'Dependency1', :path => './Dependency1', :modular_headers => true
  pod 'Dependency2', :path => './Dependency2', :modular_headers => true
  pod 'Dependency3', :path => './Dependency3'
Run Code Online (Sandbox Code Playgroud)

现在,如果您在主项目或另一个新 Pod 中使用 A 类和 B 类,编译器会告诉您

Definition of 'A' must be imported from module 'Dependency1.A_Dep1' before it is required
Run Code Online (Sandbox Code Playgroud)

在清理构建文件夹和模块缓存文件夹后,此问题有时会消失。

这个简单的示例是根据我的案例进行简化的,该案例是在一个带有 objc 和 swift 代码的大型基于组件的项目中找到的。

最重要的是为什么会发生这种情况,也许是模块映射的包含顺序或其他?如果有人能帮助我,我将不胜感激。