iOS 1 duplicate symbol for architecture arm64 解决

博客针对iOS开发中出现的“1 duplicate symbol for archite,arm64”问题给出解决方案。包括检查项目是否导入相同的.a文件、导入头文件时是否将.h写成.m、被编译文件有无重复、类文件内是否有相同名称的C函数等。

解决方案有几种:

1. 检查项目中是否导入了相同的 .a 文件,搜索.a 文件排查解决

2. 检查是否在#import头文件的时候,不小心把.h写成了.m

3. 查看被编译的文件中是否有重复的(如果有文件显示红色一般是编译器没有找到的文件)。

进入Target->Build Settings->Compile Sources下,查看是否有异常文件

4. 最后重新去检查项目里报错两个类文件,检查他们文件内是否包含有两个相同名称的C 函数,

以上进行排查基本上可以解决了

在 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]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值