芒果iOS开发之duplicate symbols for architecture x86_64错误

本文介绍了在编程中遇到的ld: duplicate symbols for architecture x86_64错误的原因及解决方法,包括重复导入相同文件、错误地导入.m文件而非.h文件以及在多个文件中重复定义同一元素等情况。

【主要内容:】


1. 错误提示

2. 分析错误原因

3. 解决问题办法



一、错误提示


在我们写代码过程中可能会经常遇到这样一个错误:

[objc]  view plain  copy
  1. <span style="font-size:32px;color:#ff0000;">ld: 4 duplicate symbols for architecture x86_64  
  2. clang: error: linker command failed with exit code 1 (use -v to see invocation)</span>  

如图:




二、分析错误原因

仔细读一下报错原因可以发现几个关键词:"duplicate"和"symbols"。

duplicate的中文意思是重复的复制的”,而symbols的意思是“符号”。也就是可能在你工程中引入了重复的东西。


三、解决问题办法


我总结了一下,出现duplicate出这个错误一般有三种情况:


3.1 重复导入相同的文件

   第一种情况:在工程中重复导入了某一个类或文件,这一般出现在你添加第三方库的时候比较多,在不知道的情况下又导入了一次相同的类。

   下图中我在工程中新建了一个src的文件夹,把Person类又复制了一遍又添加到工程中去,如图:



这个时候command + B编译之后出现如下错误:



 可以看出来报的还是duplicate的错误,虽然duplicate前边的数字可能不太准确,可是只要你看到duplicate这个关键字就可以去你工程中查找是不是有重复的东西被导入。


3.2 #import "XXX.h" 写成了#import "XXX.m"

  第二种情况:工程中在#import引入头文件的时候,将#import "XXX.h" 写成了#import "XXX.m"。错误的引入.m头文件 

我工程中有一个Person的类,然后我想在main函数中初始化一个对象,这个时候需要先引入Person类的.h文件。这个时候我引入了.m文件,如图:


    command + B 编译之后发现错误,如图:


你会发现还是duplicate这个错误。


3.3 在多个文件中重复定义某个东西

这个是由网友提供,错误原因如下:在两个文件中定义了相同的枚举,造成了deplicate的错误。


目前我只发现这三种操作会带来这个问题,其他的如果还会带来这个问题,欢迎大家提出来,帮我不断完善博客。


在 Qt 6 中,`nativeEvent` 的函数签名发生了变化,导致如果直接返回 `QMainWindow::nativeEvent(...)` 可能会引发类型不匹配和重复符号错误,尤其是在 ARM64 架构(如 Apple Silicon)上。这一问题的根源在于 Qt 6 中 `nativeEvent` 的返回类型从原本的 `long` 类型改为 `bool`,并且新增了一个 `qintptr *result` 参数用于返回平台特定的结果值 [^1]。 如果直接使用 `return QMainWindow::nativeEvent(...)`,会导致类型不匹配错误,因为旧代码期望返回一个 `long*` 类型,而 Qt 6 的实现返回的是 `bool` 类型,并通过 `result` 参数来传递实际的平台返回值。此外,在某些构建配置下,还会出现重复符号错误duplicate symbols for architecture arm64),这是由于链接器在多个翻译单元中找到了相同的符号定义,可能源于错误地包含或重复定义了 `nativeEvent` 函数实现 [^1]。 为了解决类型错误,应确保 `nativeEvent` 的实现符合 Qt 6 的签名规范,并在调用基类函数时正确处理返回值和 `result` 参数。以下是一个示例实现: ```cpp bool MyMainWindow::nativeEvent(const QByteArray &eventType, void *message, qintptr *result) { // 自定义事件处理逻辑 if (eventType == "windows_generic_MSG") { MSG *msg = static_cast<MSG *>(message); if (msg->message == WM_KEYDOWN) { // 处理按键事件 *result = 0; // 设置平台相关返回值 return true; // 表示事件已被处理 } } // 调用基类方法 return QMainWindow::nativeEvent(eventType, message, result); } ``` 此实现确保了在调用 `QMainWindow::nativeEvent(...)` 时,返回值是 `bool` 类型,并且将结果写入 `result` 指针中,符合 Qt 6 的接口规范 [^1]。 为了避免重复符号错误,应确保每个 `nativeEvent` 实现仅在单个翻译单元中定义。如果多个源文件中定义了相同的函数或符号,链接器将报错。可以通过将事件处理逻辑封装到单独的类或函数中,或使用命名空间和静态变量来避免冲突。 此外,由于 `nativeEvent` 是平台相关的接口,仅在特定平台上有效(如 macOS 上使用 `NSEvent`,Windows 上使用 `MSG` 结构),因此在跨平台项目中应结合条件编译机制,确保代码在不同平台下正确运行 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值