链接器错误 - 目标 C

Posted

技术标签:

【中文标题】链接器错误 - 目标 C【英文标题】:Linker Error - Objective C 【发布时间】:2013-03-24 20:23:01 【问题描述】:

当我尝试从文件“VAMenuScreenViewController”导入文件“VARendererViewController.h”时发生此错误

duplicate symbol _gestureMinimumTranslation in:
/Users/Sam/Library/Developer/Xcode/DerivedData/Virtual_Human_Avatar-fwgdkxpnkzapxrdzkggtmbnfhjwb/Build/Intermediates/Virtual Human Avatar.build/Debug-iphonesimulator/Virtual Human Avatar.build/Objects-normal/i386/VARendererViewController.o
/Users/Sam/Library/Developer/Xcode/DerivedData/Virtual_Human_Avatar-fwgdkxpnkzapxrdzkggtmbnfhjwb/Build/Intermediates/Virtual Human Avatar.build/Debug-iphonesimulator/Virtual Human Avatar.build/Objects-normal/i386/VAMenuScreenViewController.o

ld:架构 i386 的 1 个重复符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

谁能给我一些

【问题讨论】:

gestureMinimumTranslation 是如何声明的?听起来您刚刚在标头中定义了常量,但它应该在标头中声明为“extern”并在源文件中定义。 【参考方案1】:

您有两个编译单元——两个源文件——定义了相同的符号。

这可能是因为您在两个单独的 .m 文件(或其他编译单元;.c、.mm 等)中定义了符号,或者因为您在头文件中定义了符号并将其导入到这两个文件中文件。或者,如果您将变量声明推入没有extern 的头文件中,那么它将导致在导入它的每个.m 文件中创建一个具有该名称的符号。

假设gestureMinimumTranslation是一个变量,那么如果你真的想要一个全局变量,那么只需要一个.m文件定义如下:

int gestureMinimumTranslation;

然后,在相应的标题中:

extern int gestureMinimumTranslation;

other .m 文件应该导入上面的标题。

【讨论】:

【参考方案2】:

链接器正在尝试用一个公共符号连接一组对象。当Compile Sources Build Phase 有重复的条目或头文件时,通常会发生这种情况。尝试删除这些。

【讨论】:

如果是这种情况,错误会有所不同。这看起来是跨两个实现文件的简单重复符号声明。

以上是关于链接器错误 - 目标 C的主要内容,如果未能解决你的问题,请参考以下文章

为 iOS 构建 OCUnit 应用程序测试目标时出现链接器错误

C编译器链接器加载器详解

使用 Hexagon DSP 工具链的多定义链接器错误

谁检测到拼写错误的函数名?编译器还是链接器?

为啥链接器链接了错误的函数?

尝试与 libcrypto 链接时链接器失败