【问题标题】:duplicate symbol _OBJC_METACLASS_$_ClassName重复符号 _OBJC_METACLASS_$_ClassName
【发布时间】:2011-07-17 07:10:37
【问题描述】:

我正在尝试运行我的 cocos2d 应用程序并遇到此错误,因为我最近将我的 sdk 升级到 4.2 并将我的 cocos2d 升级到 0.99.5。

我尝试清理我的项目,甚至更改了目标 ios 部署,但错误仍然存​​在。还要重命名 className 以避免与 cocos2d 的库类名称重复。

ld:重复符号_OBJC_METACLASS_$_MenuSceneNew in /Users/umaidsaleem/Desktop/functionalityTest/build/Debug-iphonesimulator/libcocos2d library.a(MenuScene.o) 和 /Users/umaidsaleem/Desktop/functionalityTest/build/functionalityTest.build/Debug-iphonesimulator/functionalityTest.build/Objects-normal/i386/MenuScene.o

【问题讨论】:

    标签: objective-c cocos2d-iphone


    【解决方案1】:

    您正在链接文件 MenuScene.m 两次。您显然在静态库和主应用程序中都有它。

    【讨论】:

    • 我什至把之前的名字也改成了MenuSceneNew,整个类名也改成了MenuSceneNew.h,MenuSceneNew.m,但错误还是一样。
    • @user366584:重命名类或文件都没关系,事实上,它被链接了两次。
    • 我有这个问题。那么,如果您的静态库依赖于该文件(该文件也在您的主应用程序链接的另一个静态库中),您会怎么做?
    • @NYCTechEngineer 静态库可以依赖于其他静态库。我不确定它在 Xcode 中是如何工作的(我为 OS X 编写代码,您可以在其中将所有内容放入动态框架中),但在普通 C 中,您必须确保静态库以正确的顺序链接。如果liba 调用libb 中的函数,您需要确保libb 出现在链接器命令行之后 liba
    【解决方案2】:

    我自己想出了解决方案,抱歉发布有点延迟。非常感谢所有帮助,但是当我添加新的 CCLayer 派生类并选中 cocos2d 0.99.5 静态库时出现问题,这是错误的。然后我在不检查和清理目标的情况下重新广告我的课程,然后构建并运行。现在问题解决了。

    【讨论】:

      【解决方案3】:

      当一个尚未添加到项目中的文件在项目中的某处被引用时,我也遇到过这个特定的错误。我遇到过这种情况的两种情况是,我从项目中删除/删除了文件而不删除对它们的引用,以及在队友添加了引用但我没有将文件添加到我的版本的项目中合作时项目。

      我知道 OP 已经解决了他们的问题,但我觉得这可能会帮助其他在寻求帮助时阅读此问题的人。

      【讨论】:

        【解决方案4】:

        要检查的另一件相当简单的事情是,您并没有不小心将#import 变成.m 文件而不是.h 头文件。

        发生在我身上。

        【讨论】:

        • 啊哈!这正是我刚才得到的。感谢您的评论。我知道我在跟踪一个愚蠢的错误,但不确定是哪一个,而且确实够了..!
        • 人们需要意识到这个错误发生的方式不仅仅是链接两次。谢谢!
        • XCode 必须警告我们这一点。我偶尔会犯同样的错误
        【解决方案5】:

        另一个原因,对于那些和我一样的人来说,可能是你重新创建了一个托管对象类。通过这样做并在项目结构中选择另一个组,您会意外创建对相同文件的另一个引用。

        我最终在项目的根目录和我的模型组中都获得了头文件和实现的两个参考。删除对 .h 和 .m 文件的最顶层引用消除了链接失败。

        【讨论】:

        • 谢谢!我没有注意到这一点。多么可怕的浪费时间。再次感谢您的提示。
        • 谢谢!这是我的问题。果然,我实际上在同一个 Models 文件夹中有 header & impl 2x !我以前也遇到过这种情况,但读到这篇文章让我看得更近了。 掌心
        • 刚刚遇到这个问题,问题是我在一个名为“x”的组中创建了我的实体,然后在组“y”中重新创建...由于某种原因,愚蠢的 pbxprojec 文件保留了对一切,我的构建失败了。
        • 是我的问题(再次)。我认为源文件可能不止一次地包含在构建目标中是有原因的,但是如果 Xcode 对此发出警告会很好。他们不断警告我们未使用的变量,所以为什么不过度使用源 ;-) TMS 错误...太多源
        【解决方案6】:

        XCode Beta 在删除对类的引用时崩溃了。这导致了答案中描述的问题,修复方式再次不同。

        在我的目标的构建阶段,在“编译源”下,让我悲伤的项目是红色的。我无法使用减号按钮将其删除,但在编译器标志中键入“skip”会导致红色类在重新加载项目后消失。我假设你可以在那里输入任何内容。

        我花了两个小时才找到我的问题的解决方案,我把它放在这里为有这个问题的人提供另一种选择,尽管它可能不会成为一个常见的选择。

        【讨论】:

          【解决方案7】:

          检查双重链接的另一件事 - 左侧文件列表中的两个不同位置可能有相同的文件。然后编译器编译并链接它两次。

          例如,在组织文件层次结构时会发生这种情况。

          您不必制作库或任何花哨的东西 - 只需将 .m 拖到项目树中的两个不同位置即可。

          记住只删除对其中一个的引用,不需要文件回收。

          【讨论】:

            【解决方案8】:

            没有一个答案对我有用,所以我所做的就是从项目中删除文件并仅选择删除引用。

            然后我添加回相同的文件并且它起作用了。

            这解决了我的错误。由于该项目是多方协作的,因此 XCode 可能丢失了存储在某处的引用。

            希望对某人有所帮助。

            【讨论】:

            • 这对我也有用。在提交期间,我查看了 .pbxproj 文件中的更改,发现在损坏的版本中,在 PBXSourcesBuildPhase 部分中,在文件数组中,问题文件被列出了两次。这发生在文件被重命名、提交、推送,然后被同事拉取之后。这显然是 Xcode/git 中的一个错误。我重命名或添加了一堆文件;只有这个因为某种原因搞砸了。
            【解决方案9】:

            检查您的目标的编译源并查看一个 class.m 文件是否包含两次

            【讨论】:

            • 简单高效!
            【解决方案10】:

            出现此类错误的另一种可能性是类名冲突。您的项目中有 2 个具有相同名称的类,或者您的项目中的类与某些依赖库中定义的类发生冲突。

            【讨论】:

              【解决方案11】:

              从右侧面板中删除目标并再次添加目标。这将删除所有重复的引用。 如果两个程序员添加相同的目标并提交项目文件,可能会发生这种情况。

              【讨论】:

                【解决方案12】:

                我犯的一个愚蠢的错误是我将@implementation 命名为与我的超类相同。

                .h

                @interface Subclass : Superclass
                @end
                

                .m

                #import "Subclass.h"
                
                @implementation Superclass
                @end
                

                谷歌的常规建议似乎都没有帮助,所以如果有人像我一样疯狂或疲倦(也许两者兼而有之),请确保您没有重复 @implementation

                【讨论】:

                • 有时需要进行大量搜索才能找出您犯的愚蠢的小错误。非常感谢。
                • 谢谢您,先生! :D
                【解决方案13】:

                对我来说,从“其他链接器标志”中删除 -all_load 解决了这个问题。

                【讨论】:

                  【解决方案14】:

                  在我的情况下,我使用的二进制库包含与我在外部使用的相同的类名, 所以我改变了我的班级名称,它工作正常:)

                  【讨论】:

                    【解决方案15】:

                    我有一个有 2 个目标的项目。一个名为 Component 的目标和第二个名为 Sample 的目标。示例使用组件作为链接库。 然后 Component 使用了一个名为 MyPod 的 pod(与 cocoapod 一起安装)。

                    Podfile 是这样写的:

                    def shared_pods
                       pod 'MyPod' 
                    end
                    
                    target 'Component' do
                        shared_pods  
                    end
                    
                    target 'Sample' do
                        shared_pods
                    end
                    

                    两个目标都引用了共享 pod 列表。构建组件目标时,没有出现问题,但是在构建示例时,我得到一个重复的符号 _OBJC_METACLASS_$_ClassName。 我已将 Podfile 更改为:

                    def shared_pods
                        # empty
                    end
                    
                    target 'Component' do
                       pod 'MyPod'
                       shared_pods  
                    end
                    
                    target 'Sample' do
                        shared_pods
                    end
                    

                    这样就解决了问题。 花了3个小时,希望能节省一些时间。

                    【讨论】:

                      【解决方案16】:

                      Core Data 有时会将 AnyProjectNameModel.xcdatamodeld 插入到构建阶段的编译源中。检查并删除它,一切都会再次运行...... 错误消息仅表明生成的 ManagedObjects... AnyProjectNameModel.xcdatamodeld 的正确位置是 Build Phases 中的 Copy Bundle 资源。

                      【讨论】:

                      • 这非常令人沮丧。谢谢。
                      • 在我的情况下,它发生在我从项目中删除对 CoreData 文件的引用并通过拖放重新添加它们时
                      【解决方案17】:

                      在我的情况下,这是因为 Xcode 自动生成我的 NSManagedObject 类,然后与我手动创建的 NSManagedObject 类发生冲突。在这种情况下,您可以在新创建的实体的数据模型检查器中将“Codegen”设置为“Manual/None”。

                      【讨论】:

                        【解决方案18】:

                        就我而言,我已将 libxxxx.a 添加到子项目和主项目中的“与库链接二进制”部分。因此有重复的符号。从子项目中删除修复了它。

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 2011-05-22
                          • 1970-01-01
                          • 1970-01-01
                          • 2019-01-26
                          • 2020-10-20
                          • 2016-02-03
                          • 2018-12-12
                          相关资源
                          最近更新 更多