如何避免桥接标题中的“重新定义”和“重复协议”定义错误

时间:2014-10-06 12:11:31

标签: objective-c swift

我想在swift类中使用objc库和objc类。所以我将以下内容放在Bridging-Header.h中:

#import <FooLibrary/FooLibrary.h>
#import "FooClass.h"

问题是FooClass.h有

#import "FooLibrary.h".

因此,当我编译时,我会收到数百个错误:&#34;重新定义枚举器&#34;和&#34;财产有先前的定义&#34;和#34;重复的协议定义&#34;和&#34; Typedef重新定义&#34;

我该如何避免这种情况?看起来这只是我所拥有的一个愚蠢的心理障碍,但我无法通过它,所以我在这里问。

PartiallyFinite建议我留意#include

我做了一个项目范围的搜索,而我根本没有使用它。图书馆里有一些。我选择了其中一个错误。装饰所在的文件永远不会包含在#include

的任何文件中

3 个答案:

答案 0 :(得分:10)

听起来有些事情导致预处理器认为第二个FooLibrary.h间接导入的#import标题与您刚才包含的文件不同。我最好的猜测是什么是你的第一个框架式导入引用了在构建期间复制到构建位置的头文件,而你的第二个直接文件导入引用了头文件,因为它在您的项目目录中,这意味着预处理器将它们视为两个完全独立的文件,导致它被导入两次。

建议的解决方法:

  1. 如果您可以使用框架样式的导入语法(例如FooClass.h)来包含#import <FooLibrary/FooClass.h>,那么可能会解决问题。

    < / LI>
  2. 如果您完全确定FooClass.h总是包含FooLibrary.h,您可以完全省略第一次导入,因为所有内容都会间接导入通过第二个。

  3. 否则,您可以尝试一些不错的老式包含警卫(假设您具有对库标题的写入权限):

    // FooLibrary.h
    
    #pragma once // Maybe even throw in one of these for good measure;
                 // since we're dealing with an obscure-sounding bug,
                 // may as well try to fix it in all of the possible ways
    
    #ifndef FOOLIBRARY_IMPORTED
    #define FOOLIBRARY_IMPORTED
    ... // actual file contents
    #endif
    

    这将在第一次导入文件时定义预处理器宏,因此第二次预处理器尝试导入文件时,已定义的宏将阻止第二次导入内容。我无法理解为什么#import在你的情况下没有做到这一点,因为这实际上是它唯一的目的和优于#include的优点,但是如果它解决了它,¯\ _(ツ)_ /¯

答案 1 :(得分:3)

这也可能是由cocoapods引起的 - 尝试升级或降级到其他版本并重新运行pod install

答案 2 :(得分:2)

对我来说,当我升级Xcode时就发生了这种情况。我所做的只是清理构建文件夹并再次运行它有效!