2014-10-06 21 views
7

定義錯誤,我想用一個objc庫和objc類迅速類。所以,我把在橋接-Header.h如下:如何避免「再定義」和「複製協議」,在橋接報

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

的問題是,FooClass.h具有

#import "FooLibrary.h". 

所以我編譯時得到數百錯誤的,如:「的重新定義枚舉」和‘物業有以前的定義’和‘副本協議定義’和‘重新定義的typedef’

如何避免這種情況?看起來這只是我的一個愚蠢的心理障礙,但我無法克服它,所以我在問。

PartiallyFinite建議我觀看#include

我做了一個項目範圍內的搜索,我和不使用它。圖書館裏有幾個。我選擇了其中一個錯誤。該文件的裝修是在永遠不會包含在#include

+1

這應該被自動避免,因爲'#import'確保每個文件只被導入一次。你確定你不是不小心在某處使用'#include'嗎? ('#include'不包括檢查以確保文件只被導入一次) – Greg 2014-10-06 12:20:35

+0

@PartiallyFinite請參閱我的編輯。感謝您的評論。我沒有檢查過,但它似乎仍然不是問題。 – 2014-10-06 13:00:44

回答

9

聽起來象是任何文件引起的預處理相信FooLibrary.h頭第二#import間接進口是有點不一樣的文件,你只包括上面的一個它。我最好的猜測,什麼是你的第一個,框架式的進口會引用複製到構建過程中生成位置的頭文件,而你的第二個,直接導入文件中引用的頭文件,因爲它是在你的項目目錄,這意味着預處理器將它們視爲兩個完全獨立的文件,導致它被導入兩次。

建議的方式來解決:

  1. 如果你可以包括FooClass.h使用框架的方式導入語法(如#import <FooLibrary/FooClass.h>),這將可能解決問題。

  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,但如果這修復它,¯\ _(ツ)_ /¯

+0

1.這個類有'#import「FooLibrary.h'我把它改成了'#import '這就修正了它(這就是你想要說的#1嗎?我從中可以理解,但這就是讓我嘗試做的工作的原因。) – 2014-10-06 18:52:41

+0

2.有一些注意事項,我只想通過幾個場景 場景1工作:刪除'#import '來自橋接頭。 場景2失敗:從橋接頭中刪除'#import 'FooClass.h在#橋中有#import bridging-header' AnotherFooClass.h有'#import「FooLibrary.h' - 這會產生同樣的問題。 我沒有嘗試3. – 2014-10-06 19:11:25

+1

@LucasGoossen這就是我正在說的#1。您的頭文件在構建期間被複制到某個位置,並且它正在導入複製的文件以及原始文件,但沒有意識到它們是相同的。 – Greg 2014-10-07 01:59:20

3

這也可能是由cocoapods造成的 - 嘗試升級或降級到不同的版本並重新運行pod install

+0

我正在使用cocoapods和1.在上面的建議爲我工作 – Remover 2016-08-26 11:43:05

2

對我而言,升級Xcode時發生了這種情況。我所做的只是清理生成文件夾,然後再次運行,並且工作正常!