Xcode下体系结构x86_64的重复符号


219

我现在有与上述标题相同的问题,但尚未找到正确的答案。我得到了错误:

    /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到中的错误的原因Other Linker Flags。删除此值后,我可以成功构建项目,但是我不知道为什么。谁能解释一下?


链接器遇到了多次定义的符号-确切地说是75。这可能是因为你#include“d或#import” d东西(可能是MoboSDK,不管它是什么)不止一次。
ravron 2014年

这个错误发生在我添加GoogleConversionTrackingSDK-iOS-3.0到我的项目之后。

这不是您的情况,因为在我添加google的sdk之前,我的项目构建成功。

亚当·韦特(Adam Waite)的第二个回答确实是直截了当的。确保没有任何地方导入.m文件。
Bogdan

就我而言,我试图在两个单独的类中使用相同的字符串数组名称。当我在其中一个类中更改了数组名称时,此错误已被消除。
希望

Answers:


109

体系结构x86_64的75个重复符号

意味着您已经两次加载了相同的功能。由于-ObjC从此Other Linker Flags, 选项中删除后问题消失了 ,因此此选项导致函数加载两次:

来自技术问答

该标志使链接器加载库中定义了Objective-C类或类别的每个对象文件。尽管此选项通常会导致更大的可执行文件(由于将附加的目标代码加载到应用程序中),但它将允许成功创建包含现有类类别的有效Objective-C静态库。

https://developer.apple.com/library/content/qa/qa1490/_index.html


1
换句话说,请确保删除xcode项目中的所有对象文件。
锁骨中的假说

5
它也对我有用,但是我的其他库都取决于-ObjCflag。因此,我必须在项目设置中保留此标志。那么,您能否建议其他解决方案?
Sunil Targe '16

3
我猜您需要检查所有库:如果出现重复的链接器错误,则意味着您在2个或更多库中具有相同的源代码。
David V

我不得不删除一些在Xcode的Target-> Build Phases-> Link Binary With Libraries下抱怨的React库,因为它与我的React可可豆荚安装冲突
Coty Embry

就我而言,我有导入.m文件。如此愚蠢的错误。一旦我导入.h文件。准备好了!!谢谢
拉维

261

对我而言,将“否通用块”从“是”更改为“否”(在“目标”->“构建设置”->“ Apple LLVM-代码生成”下)解决了该问题。


3
这解决了我的问题。是否需要将其更改回NO?这背后的原因是什么?
Hemang,2015年

3
是的,这可以解决问题,但不能解决问题的原因。如果定义了const,请确保定义正确。就我而言,我只是忘记了“外部”。在Sauvik Dolui答案中提到了这一点。
可可

10
Xcode 8将此更改作为其自动更新之一进行了提示,并破坏了我的构建:/
pkamb

1
在花费2个小时后,由于此答案,此问题已解决。谢谢
Manish Pathak

1
可行

250

愚蠢的,但请确保您没有#import.m某个地方错误地编辑过文件


3
我没有这样做,但是这个解决方案帮助我找到了我所做的就是在.h文件中的@interface块之外错误地声明了一个变量。
滑板车

使用单元测试时,仅生成.m文件。我为它创建了一个头文件,尽管我猜这不是最好的解决方案-我想创建一个基础测试类。
布鲁诺·穆尼兹

非常感谢您为我犯下如此愚蠢的错误而开悟。
丹尼尔·利马

跨项目导入.m文件如何?
–noveleven

54

就我而言,我只是创建了一个头文件来定义常量字符串,如下所示:

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

我通过使用static以下方法解决了这种情况:

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

2
这为我解决了这个问题。虽然我加了前缀extern而不是staticextern NSString * const kNotificationName;。这很奇怪,因为您通常不添加这样的前缀,并且工作正常
。–

由于某种原因,这解决了我的问题。谢谢。我不明白为什么编译器不能给出比重复符号更好的响应,而重复符号似乎一点也不相关。
警报器

@Sirens,我还期望LLVM编译器提供更好的错误消息。无论如何,我很幸运地在2天后发现了错误。:(
Sauvik Dolui 2015年

这也是我的问题,为什么真正的问题是由这个引起的呢?
Fatlad

如果其中的所有变量AppStrings.h都是常量,这很好,但是如果您要使用全局可变变量,则会导致havok,因为每个包含头文件的源文件都将拥有自己的变量副本。这是一个不好的解决方案。
trojanfoe

32

我找到了可以解决问题的可接受答案,但并没有帮助我解决问题,希望这个答案可以解决这个令人沮丧的问题。

duplicate symbol _OBJC_IVAR_$_BLoginViewController._hud in:

17 duplicate symbols for architecture x86_64

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

用外行术语来说,这意味着我们在项目中有两个文件,它们的名称完全相同。也许您正在将一个项目合并到另一个项目中?查看“重复符号”错误上方的错误,以查看哪个文件夹被重复,在我的情况下是BLoginViewController。

例如,在下面的图像中,您可以看到我有两个BImageViewControllers,对我来说,这就是导致此问题的原因。

一旦我删除了一个,问题就消失了:)

在此处输入图片说明


2
巨大的帮助,谢谢。我已经备份了使用cocoapods的项目。当我忘记在Xcode中重新加载备份并发现它无法生成时需要打开工作区时,我将AFNetworking直接添加到项目中。随后,我继续重新设置了cocoapods,其中包括AFNetworking作为依赖项,却忘记了删除我添加到项目中的原始AFNetworking文件夹。
JanB

32

我有同样的问题。在Xcode 7.2中的项目目标>构建设置>无通用块路径中,我将其更改为NO。


4
这是我的问题。这是Xcode 8进行的设置。谢谢!
罗伯特·克莱格

30

当您在不同的类中声明具有相同名称的const变量时也会发生:

在Message.m文件中

const int kMessageLength = 36;

@implementation Message

@end

在文件Chat.m中

const int kMessageLength = 20;

@implementation Chat

@end

1
不是const,但是当我更改变量名称时它对我
Oktay

我在两个不同的类的@implementation中定义了我自己的类变量的指针
ammianus

在编译时,编译器仅在header.h文件中检查重复的符号(此处为全局变量)。但是在链接时,还检查了Implementation..m文件中的(全局)变量,如果有任何重复,链接器将通过错误显示:重复符号_xyz
PANKAJ VERMA

30

当我接受两年前在Objective-C中开发的项目中的“推荐设置”弹出窗口时,就发生了这种情况。

问题是,当您接受“推荐设置”更新时,Xcode会自动更改或添加一些构建设置,包括 GCC_NO_COMMON_BLOCKS = YES;

这使构建失败,并duplicate symbol出现我更新的项目中的错误。因此,我更改No Common BlockNO构建设置,错误消失了。


3
是的,这对我有所帮助。Xcode 8将较旧的项目更新为建议的设置。切换回去,我很高兴再次去。谢谢!
佐尔坦

2
做得好。对我有很大帮助!亲爱的,您的投票最多!;-)
海伦·伍德

1
出色的

16

查找重复项的最快方法是:

  1. 前往目标
  2. 转到构建阶段
  3. 转到编译源
  4. 删除重复的文件。

天哪,这是我的情况,非常感谢!现在我欠您4个小时的生活和一些啤酒:)
Miroslav

1
不客气,但是不,谢谢,我不喝酒:)编码愉快。
J. Goce

再增加几个小时。
CJ_COIMBRA

为我工作!谢谢!
redolent

15

遵循以下步骤为我解决了这个问题。

  1. 转到目标设置中的构建阶段。
  2. 转到“将二进制文件与库链接”。
  3. 检查任何一个库是否存在两次。
  4. 重新构建。

13

从其他链接器标记中删除-ObjC或请检查是否误导入了.m文件,而不是.h文件。


1
嘿,每个人都还在想为什么-ObjC标志不起作用-请注意这个答案。我完全错了-ObjC标志在我的“超级特殊”情况下不起作用。在项目中搜索了smth之后,就像.m"我注意到我确实导入了.m文件而不是.h,并修复了它的正常工作!Talk is cheap, show me the code!干杯!
bgplaya 2015年

9

我在Xcode 7.3中打开的一些旧项目的情况是:

duplicate symbol _SomeEnumState in:

然后是两个不相关的文件的列表.o,然后重复了几次,最后是:

ld: 8 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

对我来说解决的是将枚举声明从:

enum SomeEnumState {
    SomeEnumStateActive = 0,
    SomeEnumStateUsed = 1,
    SomeEnumStateHidden = 2
} SomeEnumState;

对此:

typedef NS_ENUM(NSUInteger, SomeEnumState) {
    SomeEnumStateActive = 0,
    SomeEnumStateUsed = 1,
    SomeEnumStateHidden = 2
};

如果有人对此有解释,请赐教。


同样的事情为我解决了这个问题,当我将枚举切换为typedef NS_ENUM时,它修复了重复符号错误
Mark24x7,2013年

9

在多个类中的@implementation下定义相同的变量也会导致此问题。


但为什么?使用相同名称的普通C函数在我身上也遇到了同样的情况
vib

9

就我而言,该位置有两个同名文件

目标>构建阶段>编译源并删除所有重复文件。



7

安装Cocoapods之后,我遇到了这个问题。现在,每次我更新一些Pod时都会发生。我发现的解决方案:

前往终端:

1) pod deintegrate
2) pod install

另外,在构建设置中检查“始终嵌入Swift库”项。应该“褪色”以表示它正在使用默认配置。如果将其设置为手动,则单击“删除”以将其还原为默认配置。这停止了​​行为。


这对我有用。但是,“始终嵌入Swift库”已设置为NO。我将其切换为“是”,然后单击“删除”,然后运行上述的pod功能。
BVB09

5

对我来说,在Xcode8推荐的项目设置期间,将“ No Common Blocks”更新为YES,这会导致此问题。


当应用于旧项目时,此处与Xcode8.2.1相同。
onekiloparsec

这也固定在XCode 11.3.1上
LowFieldTheory

5

今天,我遇到了同样的错误。错误的关键字是duplicate。我通过以下方式修复它:

1. Remove the duplicate file at Build Phases-->Compile Sources
2. If you can not remove it at Build Phases, you need find the file at your project and remove the reference by DELETE :

删除参考

3. Add the file to your project again
4. Add the file's .m to your Build Phases-->Compile Sources again
5. Build your project, the error will disappear

谢谢!就我而言,我编译了两个main.m,其中一个是旧引用。这是由拖放引起的。

4

确保没有偶然导入.m文件,您可能想要在“项目”窗口中删除派生的数据,然后再次构建并运行。


4

对于遇到此问题的其他任何人,我在这些答案中都没有看到我的解决方案。

手动解决了.pbxproj合并冲突(尽管效果很差)之后,.pbxproj中存在对单个类文件的重复引用。从“项目”>“构建阶段”>“编译源代码”中删除这些内容对我来说已解决了所有问题。

希望这可以帮助某人。


也有合并冲突,必须在pbxproj文件中手动解决它们。最终以ld: X duplicate symbols for architecture x86_64。通过删除错误消息中提到的源文件并将其重新添加到项目中来修复此问题。
kas-kad

4

与Juice007相似,我在两个不同的.m文件(没有导入!)中声明并初始化了C类型变量。

BOOL myVar = NO;

但是,即使在.m中,甚至在@implementation中,也可以使用这种声明和初始化变量的方法来授予其全局范围。您的选择是:

  1. 声明为static,以将范围限制为class:

    static BOOL myVar = NO;
  2. 删除初始化(这将使两个类共享全局变量):

    BOOL myVar;
    -(void) init{
        myVar = NO;
    }
  3. 声明为属性:

    @property BOOL myVar;
  4. 在@interface中将其声明为适当的iVar

    @interface myClass(){
        BOOL myVar;
    }
    @end


3

最近头疼,寻找错误源。当我发现我的应用程序不想编译时,我感到很奇怪,仅仅是因为我在不同的类中有以下代码片段:

dispatch_time_t getDispatchTimeByDate(NSDate *date)
{
    NSTimeInterval interval;
    double second, subsecond;
    struct timespec time;
    dispatch_time_t milestone;


    interval = [date timeIntervalSince1970];
    subsecond = modf(interval, &second);
    time.tv_sec = second;
    time.tv_nsec = subsecond * NSEC_PER_SEC;
    milestone = dispatch_walltime(&time, 0);

    return milestone;
}

希望对您有所帮助。


小帮手功能,意外复制,容易被忽略-谢谢!
史蒂文·劳

3

希望对您有所帮助

我在架构x86_64上遇到相同的错误3重复符号

就我而言,我已经从同一项目的另一个文件中复制了代码。将Am文件的代码复制到Bm,并在编译后得到一个错误。我已经通过更改全局变量的名称解决了错误。

在我的情况下出现此错误是因为两个文件中的全局变量声明相同。


3

添加Pod存储库时出现相同的错误

pod 'SWRevealViewController'

用于从gitHub添加的源代码(SWRevealViewController)。因此,可以通过删除源代码或pod存储库来修复错误。

案例2:

第二次,当我在.h文件中声明常量时出现此错误。

NSString * const SomeConstant  = @"SomeValue";
@interface AppDelegate : UIResponder <UIApplicationDelegate> {
...
...

案例2为我节省了一夜。谢谢!
Pankaj Yadav

3

上面的答案对我不起作用。这是我的解决方法:

1)在finder中,删除整个Pods文件夹和Podfile.lock文件2)关闭xcode项目3)在终端中运行pod install 4)打开xcode项目,运行clean build命令

之后为我工作。


2

当我将lob项目集成到项目中时,我也会遇到同样的问题。

在此处输入图片说明

实际上lob项目中也有AFNetworking文件,因此我从lob项目中删除了.m文件。

在此处输入图片说明

实际上.m文件与我的项目POd / AFNetworking / .m文件冲突

在此处输入图片说明


2

在Xcode 6.3.2中。我已经检查了所有可能性,如下所示

1:我没有在项目中导入.m文件。

2:-ObjC其他链接器标志中删除

3:删除了我所有的派生数据

仍然我得到同样的错误。我通过从.pchfile中删除任何变量声明来删除此错误。就我而言,我已经AppDelegate.pch文件中声明了对象。终于我找到了导致错误的原因。所以我从.pch文件中删除了任何变量的声明,并删除了我的项目的工作魅力。


2

另一个会导致此错误的愚蠢错误是重复文件。我不小心将某些文件复制了两次。首先,我进入目标->构建阶段->编译源代码。在那里,我注意到该列表上有一些文件及其位置。


我不知道为什么有人拒绝了你,这解决了我的问题。
Yawar'5

2

我今天也有这个错误,这是因为我在文件中定义了一个const值,.m但是我定义了另一个.m包含该const值的文件,这意味着它具有两个相同的const值,因此出现此错误。我的解决方案是static在const值之前添加关键字“ ”,例如:

static CGFloat const btnConunt = 9;

然后,我构建该项目,它将不会报告此错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.