Xcode下架构x86_64的重复符号

lee*_*lee 201 objective-c ios xcode5

我现在对上面的标题有同样的问题,但还没有找到正确的答案.我收到了错误:

    /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)
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏.

最后  我找出了这个错误的原因,因为我加入-ObjCOther Linker Flags.删除此值后,我可以成功构建我的项目,但我不知道为什么.有谁能解释一下?

小智 252

对我来说,将"No Common Blocks"从Yes更改为No(在Targets-> Build Settings-> Apple LLVM - Code Generation下)修复了问题.

  • Xcode 8提示此更改是其自动更新之一并破坏了我的构建:/ (10认同)
  • 这解决了我的问题.是否需要将其改回"否"?这背后的原因是什么? (3认同)
  • 是的,这解决了问题,但不是背后的原因.如果您定义了const,请确保定义正常.在我的情况下,我只是忘了"外部".这在Sauvik Dolui回答中提到. (3认同)
  • 这可行,但我必须在目标和项目中更改它 (2认同)

Ada*_*ite 246

愚蠢的,但要确保你没有#import.m某处错误地编辑过文件

  • 我没有这样做,但这个解决方案帮助我找到了我所做的事情,即错误地在.h文件中的@interface块之外声明一个变量. (3认同)

Dav*_*d V 96

架构x86_64的75个重复符号

表示您已经加载了两次相同的功能.由于问题进行去除后消失 -ObjCOther Linker Flags, ,这意味着该选项结果是功能加载两次:

来自技术问答

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

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

  • 它也适用于我,但我的其他库依赖于`-ObjC`标志.所以我必须在项目设置中保留此标志.那么请你建议任何其他解决方案? (5认同)
  • 我想您需要检查所有库:如果您遇到重复的链接器错误,这意味着您在2个或更多库中具有相同的源代码. (3认同)
  • 换句话说,请确保删除 xcode 项目中的所有目标文件。 (2认同)

Sau*_*lui 53

在我的例子中,我刚刚创建了一个头文件来定义这样的常量字符串:

NSString *const AppDescriptionString = @"Healthy is the best way to keep fit";
Run Code Online (Sandbox Code Playgroud)

我使用static以下方法解决了这个问题

static NSString *const AppDescriptionString = @"Healthy is the best way to keep fit";
Run Code Online (Sandbox Code Playgroud)

  • 这解决了我的问题.虽然我以`extern`而不是`static`为前缀:`extern NSString*const kNotificationName;`.这很奇怪,因为你通常没有添加这样的前缀,它工作得很好.. (2认同)

小智 31

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

  • 这是我的问题.这是Xcode 8提供的设置.谢谢! (4认同)

sim*_*ley 30

我发现接受的答案触及了问题,但没有帮助我解决它,希望这个答案将有助于解决这个非常令人沮丧的问题.

duplicate symbol _OBJC_IVAR_$_BLoginViewController._hud in:

17 duplicate symbols for architecture x86_64
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

在此输入图像描述

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

Luc*_*nzo 29

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

在文件Message.m中

const int kMessageLength = 36;

@implementation Message

@end
Run Code Online (Sandbox Code Playgroud)

在文件Chat.m中

const int kMessageLength = 20;

@implementation Chat

@end
Run Code Online (Sandbox Code Playgroud)

  • 不是 const 但当我更改变量名称时它对我有用 (2认同)

Bla*_*ard 28

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

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

这使得构建失败并且duplicate symbol更新了我的更新项目中的错误.所以我改变了No Common BlockNO我的构建设置和错误不见了.

  • 是的,这对我有帮助.Xcode 8,将旧项目更新为推荐设置.切换回来,我很高兴再去.谢谢! (3认同)
  • 做得好.帮了我很多忙!为你亲爱的投票!;-) (2认同)

TDe*_*ign 18

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

进入终端:

1) pod deintegrate
2) pod install
Run Code Online (Sandbox Code Playgroud)

此外,请检查您的构建设置中的“始终嵌入 Swift 库”项。它应该是“褪色”,表示它正在使用默认配置。如果它设置为手动 YES,请点击删除以将其恢复为默认配置。这停止了​​行为。


小智 14

找到副本的最快方法是:

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


CKR*_*666 13

从其他链接器标志中删除-ObjC或者请检查您是否错误导入了任何.m文件而不是.h文件.

  • 嘿,大家,谁仍然想知道为什么 -ObjC 标志不起作用 - 注意这个答案。我完全错误地认为 -ObjC 标志在我的“超级特殊”情况下不起作用。在整个项目中搜索类似 `.m"` 的 smth 之后,我注意到我确实导入了 .m 文件而不是 .h 并且在修复它之后它就起作用了!`Talk很便宜,给我看看代码!`干杯! (2认同)

小智 12

以下步骤解决了我的问题.

  1. 转到目标设置中的构建阶段.
  2. 转到"使用库链接二进制".
  3. 检查是否存在任何库两次.
  4. 再建一次.


小智 9

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


Nij*_*Nij 9

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

目标>构建阶段>编译源并删除任何重复的文件.


Kal*_*ico 9

我的问题是架构 x86_64 有 5 个重复的符号。阅读这篇文章和他们的答案后,我尝试使用常见的解决方案更改GCC_NO_COMMON_BLOCKS = YESNO

但是,我没有为我工作,而是从 5 个重复项变成了 1 个重复项......

所以,我注意到了最后一个错误,我意识到我的问题是什么,它与这些包“不兼容”(我在 中都有package.json):

rn-fetch-blob
react-native-blob-util
Run Code Online (Sandbox Code Playgroud)

该消息很清楚,我将其删除,rn-fetch-blob因为我不知道为什么它出现在我的项目中,但是,我只与 jest 一起使用并删除它,这不是问题。

因此,删除该包后,yarn再次运行,问题解决了......并且无需更改GCC_NO_COMMON_BLOCKS

  • 谢谢,它没有解决我的问题,但将重复项从 14 减少到 9 (2认同)

tad*_*ija 8

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

duplicate symbol _SomeEnumState in:
Run Code Online (Sandbox Code Playgroud)

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

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

为我解决的是改变枚举声明:

enum SomeEnumState {
    SomeEnumStateActive = 0,
    SomeEnumStateUsed = 1,
    SomeEnumStateHidden = 2
} SomeEnumState;
Run Code Online (Sandbox Code Playgroud)

对此:

typedef NS_ENUM(NSUInteger, SomeEnumState) {
    SomeEnumStateActive = 0,
    SomeEnumStateUsed = 1,
    SomeEnumStateHidden = 2
};
Run Code Online (Sandbox Code Playgroud)

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


T D*_*yen 8

更新 2021 年答案,Xcode 12.X:

pod deintegrate 
pod install
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


Dee*_*ran 7

  • 前往目标
  • 选择构建设置
  • 搜索“ No Common Blocks”,将其选择为NO

对我有用

  • 不适合我 (2认同)

Nav*_*han 5

对于我在Xcode8推荐的项目设置期间,将"No Common Blocks"更新为YES会导致此问题.


guo*_*zzu 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 :
Run Code Online (Sandbox Code Playgroud)

删除引用

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
Run Code Online (Sandbox Code Playgroud)