1、參與編譯的.m文件重復導入。一般是手動往工程中導入源文件時導入在了不同的目錄。
解決方法也很簡單,在 Target -> build parses -> complie sources,去掉重復的文件即可。
2、導入頭文件時,誤寫為導入.m 文件
即
#import xxx.h 寫成了 #import xxx.m
解決方法就是,導入頭文件。
3、定義了重復的枚舉值
這時會導致所有引用了該枚舉值的都會報重復編譯
筆者曾為了驗證原始枚舉定義和宏定義枚舉時遇到該錯誤
//舊的枚舉定義
enum NetConnectState {
NetConnectStateDisconnected,
NetConnectStateConnecting,
NetConnectStateConnected,
};
//使用 每次都要寫enum
enum NetConnectState state1 = NetConnectStateConnected;
//NetConnectState state = NetConnectStateConnecting;//會報錯
//如果用了 typedef 重新定義枚舉類型。 就可以省略 ennum,
typedef enum NetConnectState NetConnectState;
NetConnectState state2 = NetConnectStateConnecting;
//NS_ENUM, NS_OPTION 是蘋果處理過的宏,可以向后兼容,推薦使用
//枚舉宏 用foundation框架提供的 枚舉宏定義一個
typedef NS_ENUM(NSInteger, WJWNetStatus) {
WJWNetStatusDisconnected,
WJWNetStatusConnecting,
WJWNetStatusConnected,
};
//選項宏, 多個值可以同時作為選項.
typedef NS_OPTIONS(NSInteger, WJWOrentationStatus) {
WJWOrentationStatusTop = 1 << 0,
WJWOrentationStatusLeft = 1 << 1,
WJWOrentationStatusBottom = 1 << 2,
WJWOrentationStatusRight = 1 << 3,
};
由於用了typedef 聲明了同名的枚舉變量,會發生枚舉值重復定義
//使用 每次都要寫enum
enum NetConnectState state1 = NetConnectStateConnected;
//NetConnectState state = NetConnectStateConnecting;//會報錯
//如果用了 typedef 重新定義枚舉類型。 就可以省略 ennum,
typedef enum NetConnectState NetConnectState;
NetConnectState state2 = NetConnectStateConnecting;
解決方法:
盡量用宏定義枚舉,只定義一次。
4、在繼承協議的時候,Build Settings →Other Linker Flags 中添加了 -ObjC
協議文件不要添加 -Objc 編譯標示。