在Xcode下,针对架构x86_64出现了重复符号

306

我现在有与上面标题相同的问题,但还没有找到正确答案。我得到了以下错误:

    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Intermediates/TestMoboSDK-Client.build/Debug-iphonesimulator/TestMoboSDK-Client.build/Objects-normal/x86_64/MoboSDK.o
    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Products/Debug-iphonesimulator/libMoboSDK.a(MoboSDK.o)
duplicate symbol _OBJC_METACLASS_$_MoboSDK in:
    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Intermediates/TestMoboSDK-Client.build/Debug-iphonesimulator/TestMoboSDK-Client.build/Objects-normal/x86_64/MoboSDK.o
    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Products/Debug-iphonesimulator/libMoboSDK.a(MoboSDK.o)
ld: 75 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

感激任何帮助。

最后我找到了这个错误的原因,是因为我在其他链接器标志中添加了-ObjC。将此值删除后,我就可以成功构建我的项目,但我不知道原因。有人能解释一下吗?


在我将 GoogleConversionTrackingSDK-iOS-3.0 添加到我的项目后,出现了这个错误。在此之前,它是正常工作的。我也尝试将其删除,但错误仍然存在。 - lee
Adam Waite 的第二个答案非常直接。确保没有在任何地方导入 .m 文件。 - Bogdan
请确保您包含的是.h文件,而不是.m文件。 - doxsi
试试这个:http://stackoverflow.com/a/42089897/3024579 - Alok
对我来说完美地工作了! - yuchen
显示剩余5条评论
66个回答

291

对于我来说,在目标->构建设置->Apple LLVM - 代码生成下,将“没有公共块”从“是”更改为“否”解决了问题。


5
这解决了我的问题。有没有必要将其改回“NO”?背后的原因是什么? 这句话的意思是说:“这解决了我的问题。”,并且询问是否需要将其改回“NO”,同时询问其背后的原因是什么。 - Hemang
4
是的,这解决了问题,但并未解决背后的原因。如果您定义了一个常量,请确保定义是正确的。在我的情况下,我只是忘记了“extern”。Sauvik Dolui的回答中提到了这一点。 - coco
10
Xcode 8因为其中一个自动更新的原因,促使了这个变化,并导致我的构建失败 :/ - pkamb
2
经过两个小时的努力,由于这个答案,问题已经得到解决。谢谢。 - Manish Pathak
2
这个可以运行,但我不得不在目标和项目中进行更改。 - Nooblhu
显示剩余10条评论

269

可能有些愚蠢,但请确保您没有错误地在某个地方导入了一个 .m 文件


3
我之前没有这样做,但是这个解决方案帮助我找到了我的错误,我错误地在.h文件中的@interface块之外声明了一个变量。 - Scooter
在使用单元测试时,只有.m文件会被生成。我为此创建了一个头文件,尽管我认为这不是最好的解决方案 - 我想创建一个基本的测试类。 - Bruno Muniz
非常感谢你启迪我,让我意识到自己犯了如此愚蠢的错误。 - Daniel Lima
跨项目导入 .m 文件怎么样? - noveleven
只需要导入.h文件。 - Farras Doko
我尝试切换构建设置标志,但没有成功。我尝试创建一个新的头文件,导入.h而不是.m,并将我的.m文件内容放在头文件中,这样就成功了。 - Tim Sonner

131
“75个重复符号,适用于x86_64架构”,意思是您已经加载了相同的函数两次。由于在“其他链接器标志”中删除-ObjC后问题消失,这意味着此选项导致函数被加载两次:
来自技术问答:
“此标志会导致链接器加载库中定义Objective-C类或类别的每个目标文件。虽然此选项通常会导致更大的可执行文件(由于额外的目标代码加载到应用程序中),但它将允许成功创建包含现有类别的Objective-C静态库。” https://developer.apple.com/library/content/qa/qa1490/_index.html

2
换句话说,请确保删除您的Xcode项目中的任何对象文件。 - Reuben Tanner
10
这对我也起作用,但我的其他库依赖于-ObjC标志。因此,我必须在项目设置中保留此标志。请问你能否建议其他解决方案? - Sunil Targe
4
我猜你需要检查一下所有的库:如果出现重复链接器错误,那么就意味着你在两个或更多的库中有相同的源代码。请注意保持原文意思不变,同时使语言更通俗易懂。 - David V
我不得不在Xcode的Target->Build Phases->Link Binary With Libraries下删除一些React库,因为它与我的React CocoaPods安装发生了冲突。 - Coty Embry
在我的情况下,我导入了 .m 文件。太愚蠢了。我曾经导入过 .h 文件。现在可以进行构建了!谢谢。 - Ravi

67

在我的情况下,我只是创建了一个头文件来定义常量字符串,就像这样:

NSString *const AppDescriptionString = @"Healthy is the best way to keep fit";

我通过使用static来解决了这个情景:

static NSString *const AppDescriptionString = @"Healthy is the best way to keep fit";

3
这对我解决了问题。尽管我将“static”改为了“extern”,即:extern NSString * const kNotificationName;。这很奇怪,因为通常不需要加这个前缀,但它仍然能正常工作。 - user1244109
这个方法出乎意料地解决了我的问题。谢谢。我不明白为什么编译器不能给出一个更好的响应,而不是重复的符号,这似乎根本不相关。 - Allison
@Sirens,我也希望LLVM编译器能够提供更好的错误信息。不过,无论如何,我很幸运在2天后找到了错误。:( - Sauvik Dolui
这也是我的问题,那么这实际问题的原因是什么? - Fatlad
如果AppStrings.h中的所有变量都是常量,那么这样做是可以的,但是如果你想要一个全局可变变量,那么这将会造成混乱,因为每个包含该头文件的源文件都会有自己的变量副本。这是一个不好的解决方案。 - trojanfoe
@user1244109 static 是用于当你实际上有一个值 (static NSString * kFoo = @"Foo";),而 extern 是用于当你只是在说 "这个常量存在,但它的值在 .m/.c/等文件中定义。(extern NSString * kFoo;)。此外,我建议使用 FOUNDATION_EXPORT,因为它适应不同的编译环境 (ObjC、ObjC++、Win32 等)。 - Ky -

36

当您在不同的类中声明具有相同名称的常量变量时,也会发生这种情况:

在文件Message.m中

const int kMessageLength = 36;

@implementation Message

@end

在文件 Chat.m 中

const int kMessageLength = 20;

@implementation Chat

@end

2
不是const,但当我更改变量名时它对我有用。 - Oktay
我在两个不同类的实现(@implementation)中定义了一个自己类变量的指针,并遇到了这个问题。 - ammianus
在编译时,编译器仅在头文件(.h)中检查重复符号(全局变量)。但是在链接时,实现文件(.m)中的(全局)变量也会被检查,如果有任何重复,则链接器将报错:重复符号_xyz。 - PANKAJ VERMA
我不得不重新命名一些本地变量。 @implementation DIOOutstreamVideoView CGFloat visibleHeightOut; CGFloat fullHeightOut; - Bitlejuce Do

36

我有同样的问题。 在路径“项目目标 > 构建设置 > 无公共块”,我将其更改为NO,这是在Xcode 7.2中。


34

我发现被采纳的答案涉及了这个问题,但没有帮助我解决它,希望这个答案能够帮助解决这个非常令人沮丧的问题。

duplicate symbol _OBJC_IVAR_$_BLoginViewController._hud in:

17 duplicate symbols for architecture x86_64

"这意味着您已经重复加载了相同的函数。由于从其他链接器标志中删除了-ObjC后问题消失,这意味着此选项导致函数加载两次:"

通俗地说,这意味着我们的项目中有两个具有完全相同名称的文件。也许你正在将一个项目合并到另一个项目中?查看“重复符号”错误上面的错误,以查看哪个文件夹是重复的,在我的情况下是 BLoginViewController。

例如,在下面的图片中,您可以看到我有两个BImageViewControllers,对我来说这是引起问题的原因。

一旦我删除了其中一个,问题就解决了 :)

enter image description here


2
非常感谢您的帮助。我已经备份了一个使用Cocoapods的项目。当我重新加载Xcode中的备份时,由于忘记需要打开工作区,发现它无法构建,然后我直接将AFNetworking添加到了该项目中。随后,我重新设置了我的Cocoapods,其中包括AFNetworking作为依赖项,并忘记删除我添加到项目中的原始AFNetworking文件夹。 - JanB

33

当我接受了两年前在Objective-C开发的项目中的“推荐设置”弹窗时,出现了这个问题。

问题在于,当您接受"推荐设置"更新后,Xcode会自动更改或添加一些构建设置,包括 GCC_NO_COMMON_BLOCKS = YES;

这使得我的更新项目在构建时出现了 重复符号 错误。所以我将构建设置中的 No Common Block 更改为 NO,错误就消失了。


3
好的,我理解了。这是需要翻译的内容:“Yeah, this helped me. Xcode 8, updated an older project to recommended settings. Switched this back and I'm good to go again. Thanks!” 我的翻译如下:“是的,这对我很有帮助。我使用的是 Xcode 8,将一个较旧的项目更新到了推荐的设置。我将其切换回来后,一切都恢复正常了。谢谢!” - Zoltán
2
干得好。帮了我很多!为你点赞,亲爱的!;-) - Helen Wood
1
太棒了,伙计 :) - Burf2000

24

我在安装Cocoapods后遇到了这个问题。现在每次更新一些pods时都会出现这个问题。我找到的解决方法是:

进入终端:

1) pod deintegrate
2) pod install

同时,在您的构建设置中检查项目“始终嵌入Swift库”。它应该是“淡化的”,表示它正在使用默认配置。如果它被设置为手动YES,请删除它以恢复默认配置。这停止了这种行为。


这对我起作用了。然而,“始终嵌入Swift库”已经设置为NO。我将其切换为YES,然后点击删除,再运行上述的Pod函数。 - BVB09

20

找到重复文件最快的方法是:

  1. 进入“Targets”
  2. 进入“Build Phases”
  3. 进入“Compile Sources”
  4. 删除重复文件。

再加上几个小时。 - CJ_COIMBRA
这仅适用于类文件,如.h、.m或.swift文件。不适用于框架级别的文件。 - Naresh
这是最简单的方法。谢谢!我在处理C代码时遇到了这个问题,我按照这些步骤进行操作,它起作用了。尽管我必须澄清一点,不要删除带有主函数的文件,因为它不会起作用。 - Josue Gisber
谢谢!终于得到了你的答案,我第一次成功地运行了这个应用程序...非常感谢你!!! - Anirban Das

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接