我现在也有同样的问题,但还没有找到正确的答案。我得到了错误:

    /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到其他链接器标志。在删除这个值之后,我可以成功地构建我的项目,但我不知道为什么。有人能解释一下吗?


当前回答

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

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

我通过使用静态来解决这个问题:

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

其他回答

寻找目标 选择生成设置 搜索“No Common Blocks”,选择为“No”。

这对我很有效

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

在手动处理了.pbxproj合并冲突后(尽管很糟糕),在.pbxproj中有对单个类文件的重复引用。从项目>构建阶段>编译源代码删除这些为我修复了一切。

希望这能帮到你。

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

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

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

当我添加一个pod存储库时,我得到了同样的错误

pod 'SWRevealViewController'

对于已经添加的源代码(SWRevealViewController)从gitHub。因此,该错误将通过删除源代码或pod存储库来修复。

案例2:

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

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

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

BOOL myVar = NO;

然而,这种声明和初始化变量的方法,即使是在.m中,即使是在@implementation中,也赋予了它全局作用域。你的选择是:

将其声明为静态,以限制类的作用域: myVar = NO; 删除初始化(这将使两个类共享全局变量): BOOL myvar#; - (void) init { myVar = NO; } 将其声明为属性: @属性BOOL myVar; 在@interface中将它声明为一个合适的iVar @ interface myClass () { BOOL myvar#; } @end