【问题标题】:duplicate symbols for architecture i386 clang架构 i386 clang 的重复符号
【发布时间】:2012-08-30 01:34:40
【问题描述】:

我在 google 和 stackoverflow 上看到了几篇与此错误相关的帖子,我已经阅读了所有帖子,但仍然遇到问题,我很高兴找到解决方案。这是我在编译时收到的错误消息...

找不到选项“-L/Users/somefolder/Documents/Bharat/MyApp copy/GoogleAdMobAdsSDK”的目录 重复符号 _OBJC_CLASS_$_AppDelegate 在: /Users/madept/Library/Developer/Xcode/DerivedData/Alpha-dvvymdlmzseytagllsmbbrxdgutz/Build/Intermediates/Alpha.build/Debug-iphonesimulator/Alpha.build/Objects-normal/i386/AppDelegate-56890B6B994A4284.o

谢谢。

【问题讨论】:

  • 这是两个单独的错误 - 你有一个目录 - /Users/somefolder/Documents/Bharat/MyApp copy/GoogleAdMobAdsSDK
  • @Mark 我已经添加了 AdMob 库。
  • 错误提示您没有 - ls /Users/somefolder/Documents/Bharat/MyApp\ copy/GoogleAdMobAdsSDK 显示什么
  • 阅读此文,或许也有帮助:stackoverflow.com/questions/3731470/…

标签: objective-c ios5 admob


【解决方案1】:

链接器错误总是显示与库使用或导入问题有关的问题。

当您导入 .m 文件而不是 .h 文件时,有时会发生错误。

请检查您的代码并在您的一个头文件(.h 扩展名)中查找 .m 导入语句,我遇到了类似的问题并引发了 14 个重复符号错误。

检查你是否导入了ViewControler.m而不是它的.h,所以它必须是这样的:

    import "ViewController.h"

你的AppDelegate.h 应该是这样的:

import "UIKit/UIKit.h"
import "ViewController.h"
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong,nonatomic) ViewController *mainController;
@end

永远记得导入头文件而不是.m

【讨论】:

    【解决方案2】:

    我尝试清理项目,删除所有派生数据。没有任何效果。阿特拉斯,这对我有用。

    另一个原因可能是该项目在构建分发版本时针对的是模拟器而不是真实设备。这也会导致此错误消息。

    【讨论】:

      【解决方案3】:

      取自https://stackoverflow.com/a/2755581/190599

      你可以做的是把你的标题(MyConstants.h):

      extern const int MyConstant;
      extern NSString * const MyStringConstant;
      

      在源文件中,包含上面的标题,但定义常量(MyConstants.m):

      const int MyConstant = 123;
      NSString * const MyStringConstant = @"SomeString";
      

      然后,您只需将标头包含在使用这些常量之一的任何其他源文件中。标头只是声明这些常量存在于某处,因此编译器不会抱怨,因为解析这些常量名称是链接器的工作。包含常量定义的源文件被编译,链接器看到这是常量所在的位置,并解析在其他源文件中找到的所有引用。

      在标头中声明和定义常量(未声明为static)的问题在于编译器将其视为包含该标头的每个文件的独立全局。当链接器尝试将所有已编译的源链接在一起时,它会遇到与您包含 MyConstants.h 一样多次的全局名称。

      【讨论】:

        【解决方案4】:

        在某些情况下,由于您不小心在两个不同的文件中声明了具有相同名称的常量 (const),因此您还会收到“体系结构的重复符号...”错误。

        【讨论】:

          【解决方案5】:

          转到构建设置并搜索No Common Blocks并将其设置为NO。再次构建,您将不会再出现此错误。

          【讨论】:

          • 嘿它的工作,但我想知道它是如何工作的。你拯救了我的一天 Kalpesh,请让我知道它是如何工作的。再次感谢。
          • @PrabhunathReddyRS - 如果你有两个不同的类并且想为每个类创建相同的对象名,比如 NSString * strUserName。然后,如果不将 NCB 设置为否,则不能。将 NCB 设置为 YES 后,您的操作系统将允许对多个对象使用相同的对象名称。
          【解决方案6】:

          我遇到了这个问题,我被困了一段时间。对我来说,导致问题的原因是我将一些布尔值写入 .h 文件(在#import 和 @interface 之间)并将它们使用到我的 .m 文件中

          我只是将它们从我的 .h 文件中删除,然后将它们复制到我的 .m 文件中的同一位置,然后构建成功。

          【讨论】:

            【解决方案7】:

            解决此问题的最简单方法是问题 Xcode 7.0 或更高版本,只需将 no Common Blocks 更改为 NO 即可解决您的问题尝试此 Project Target > Build Setting > No Common Blocks,我将其更改为 NO。

            【讨论】:

              【解决方案8】:

              自我说明:“阅读错误!”

              就我而言,它是这样说的:duplicate symbol _OBJC_CLASS_$_SATCoreData in:

              翻译:一个名为 SATCoreData 的 Objective C 类被复制了。

              然后它给出两个符号出现的路径。读取路径指向两个以.o结尾的类文件。如果你看这两个类,你会发现一些可疑的东西。就我而言,我不小心给了两个类同名。我在另一个类的文件中有一个类,因为我正在测试一些东西并且懒得创建一个单独的类。希望这对某人有所帮助。

              【讨论】:

                【解决方案9】:

                我有两次定义相同的 C 函数的地方。在两个不同的.m 文件中。只需删除其中一个定义,瞧。

                【讨论】:

                  【解决方案10】:

                  不管你信不信,Xcode 搞砸了项目文件。我们找到的唯一解决方案是使用文本编辑器手动删除对违规文件的所有引用,然后在 Xcode 中重新添加文件。

                  【讨论】:

                    【解决方案11】:

                    我从另一个项目导入文件,它也有 main.m 文件。所以总的来说我有两个 main.m 文件,删除一个为我解决了这个问题。

                    【讨论】:

                      【解决方案12】:

                      我终于找到了解决方案-

                      1. 删除所有我添加的 AdMob SDK 的引用(也删除 也来自工作区)。
                      2. 清理您的项目
                      3. follow this link to add AdMob again
                      4. 清理并重建

                      【讨论】:

                        【解决方案13】:

                        我将测试文件复制并粘贴到项目中后出现此错误,忘记更改接口和实现行的名称:

                        @interface TDInputValidationsTests : XCTestCase
                        

                        @implementation TDInputValidationsTests
                        

                        愚蠢的错误...我还建议查看项目上的“构建阶段”选项卡以检查重复项。删除派生数据并进行干净构建也可能会有所帮助。

                        【讨论】:

                          【解决方案14】:

                          我知道在另一个项目中工作的框架存在这个问题。我已经从另一个项目中复制了文件并将其添加到这个项目中。然后在构建时出现 76 个重复错误。

                          对我来说,简单的解决方案是从其他链接器标志中删除 -ObjC。以前的项目没有。一旦我这样做了,警告就消失了,项目就成功构建了。

                          【讨论】:

                            【解决方案15】:

                            只是为了添加可能的解决方案。

                            在我的例子中,我不小心在头文件中声明并初始化了一个变量。

                            例如这是错误的:

                            我的文件.h

                            #import <Foundation/Foundation.h>
                            
                            NSInteger const ABCMyConstant = 6;
                            

                            应该是:

                            我的文件.h

                            #import <Foundation/Foundation.h>
                            
                            NSInteger const ABCMyConstant;
                            

                            我的文件.m

                            #import "MyFile.h"
                            
                            NSInteger const ABCMyConstant = 6;
                            

                            【讨论】:

                            • 我不小心在 2 个文件中声明并初始化了相同的常量
                            • 是的,这可能会导致错误。您也可以更改为静态 NSInteger const ABCMyConstant = 6;并将所有内容保存在头文件中
                            • 没有办法单独在头文件中声明常量吗?说真的,我很懒,我不想这样做两次。没有其他原因。我不想#define他们。
                            【解决方案16】:

                            我在设置 OCMock 时遇到了同样的错误。我通过在构建阶段的“复制文件”部分添加 libOCMock.a 来修复它

                            【讨论】:

                              【解决方案17】:

                              另一个原因可能是该项目在构建分发版本时针对的是模拟器而不是真实设备。这也会导致此错误消息。

                              【讨论】:

                                【解决方案18】:

                                步骤:

                                1. 检查目标设置中的构建阶段。
                                2. 检查任何文件是否存在两次或一次。
                                3. 如果文件存在两次删除一个。如果不删除底部的文件 这是最新的。
                                4. 重新构建。

                                【讨论】:

                                  【解决方案19】:

                                  如果其他人尝试了所有其他答案但仍然无法正常工作,请尝试使用您最喜欢的文本编辑器打开 .xcodeproj 文件并搜索给您带来麻烦的类的名称。确保在执行此操作之前关闭 Xcode。在文件中,.h 应该有一行,.m 应该有另一行。如果有重复,删除它们,保存文件,然后重新构建。

                                  【讨论】:

                                    【解决方案20】:

                                    我发现当我在一个 .m 文件中声明的 const 与另一个 .m 文件中的另一个 const 同名时出现错误。两个文件#included 相同的父文件。

                                    【讨论】:

                                      【解决方案21】:

                                      当我在主项目中包含一个静态库,同时还包含一个也引用该库的第二个库时,我收到了这个错误。这很令人困惑,所以也许这更清楚。

                                      我的工作区 + 主要项目 + 参考图书馆 1 + 参考图书馆 2 + 图书馆 1 + 图书馆 2 + 引用库 1

                                      我从主项目中删除了对库 1 的引用,错误消失了。

                                      【讨论】:

                                        【解决方案22】:

                                        在为 Core Data 重新创建模型类后,我刚刚经历了这一点。创建对象类的菜单选项创建了一个重复的模型类。一旦我删除了欺骗,错误就消失了......

                                        【讨论】:

                                          【解决方案23】:

                                          对我来说不同,我照原样复制了类实现方法,并且 iVars 也被复制了...所以在 iVars 的世界中有两个集合,编译器在链接 * 之前一直抱怨重复的 ivars .o 文件。

                                          读取输出有助于删除所有重复的 ivars...感谢您不需要 @synthesize 所有属性的新功能...错误消失了...

                                          【讨论】:

                                            【解决方案24】:

                                            此错误经常发生的另一个原因是意外导入 .m 文件而不是 .h。

                                            【讨论】:

                                            • 哇。 Xcode 真的需要警告我们这一点!提示:搜索 .m" 可快速找到您不小心导入错误文件的位置!
                                            猜你喜欢
                                            • 2013-03-09
                                            • 1970-01-01
                                            • 2011-09-30
                                            • 2012-10-07
                                            • 2014-05-31
                                            • 2012-12-29
                                            • 2011-08-14
                                            相关资源
                                            最近更新 更多