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 编译标示。

posted @   wjwdive  阅读(3596)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
历史上的今天:
2017-07-24 ionic 下拉选择框中默认显示传入的参数
点击右上角即可分享
微信分享提示