Xcode 報錯:duplicate symbols for architecture x86_64錯誤分析及解決


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 編譯標示。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM