【问题标题】:Weird error while linking: duplicate symbol _comparePutFoldersFirst链接时出现奇怪的错误:重复符号 _comparePutFoldersFirst
【发布时间】:2013-02-26 14:05:00
【问题描述】:

在我的项目中进行链接时出现了奇怪的行为。

问题是我有一个链接到我的项目的库,我目前正在将一些通用类从项目移动到库。

MyClass2 与 MyClass 基本相同,这意味着两个类中有一些属性名称相同,但是类(和文件)的名称不同,所以我不知道为什么链接错误是正在发生。

确切的错误如下:

duplicate symbol _comparePutFoldersFirst in:
    /Users/User/Library/Developer/Xcode/DerivedData/MyApp-aqfmfwpjnumbrjdrdqwonfwvhzaz/Build/Intermediates/MyApp.build/Debug-iphonesimulator/aTarget.build/Objects-normal/i386/MyClass.o
    /Users/User/Documents/..[path]../MyFramework.framework/MyFramework(MyClass2.o)
ld: 1 duplicate symbol for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

注意事项: - 我不包括任何 .m 文件(显然是基于我的研究的常见错误) - 在这些文件中实现的类在两个文件中具有不同的名称 - 请注意,该库实际上是作为一个框架包装的,但这不是问题,因为我使用该库有一段时间没有遇到这个问题。

提前感谢!

【问题讨论】:

    标签: ios objective-c xcode linker clang


    【解决方案1】:

    如果这些是真实的属性,或者它们是真实的实例变量或正确声明的类变量,这不是问题。

    但有时,当你工作得不够准确时,这些变量可能真的是静态的,甚至是全局的。 那就是当它们被简单地放在方法之间或@implementation 和方法体之间的开放空间中时。

    确保它们在{ ... } 中在@implementation 语句之后正确声明。我最近读到,您也可以在@implementation 声明之后使用带有 iVars 的括号,但我从未尝试过。但是,如果没有这些括号,它们只是静态的,甚至是全局的。这意味着在两个类中声明的同一个变量实际上是一个重复的符号。

    Quick&Dirty:只需重命名其中一个。 正确地:重新构建你的代码。可以通过将它们收集在@interface 之后的.h 文件中并将它们括在括号中来完成。

    如果您不希望它们出现在 .h 文件中,则以空类别开始您的 .m 文件:

    @interface myClass2 () {
       int localInstanceVar1;
       NSInteger *localInstanceOjbekct2;
    }
    

    【讨论】:

    • 感谢您的快速答复!我检查并没有静态/全局变量。我现在选择重组选项=D,这不是最快的选择。谢谢!
    • 抱歉,当我收到此链接器错误时,这就是我的一个应用程序出现的问题。您是否尝试在代码中搜索comparePutFoldersFirst
    • 贾!我认为“comparePutFoldersFirst”是跟踪的一部分,但它是在 .m 中定义的类似 c 的方法,这是冲突的!!!!谢谢!
    【解决方案2】:

    根据@Hermann 的评论,我发现了问题(实际上并不复杂:S)

    我的代码在我的 .m 文件中定义了如下方法:

    NSInteger comparePutFoldersFirst(id aValue1, id aValue2, void *context) {...}
    

    这个方法显然会生成一个引起冲突的全局符号。

    我用那个方法对数组进行排序,所以我把它换成一个块,问题就消失了。

    【讨论】:

      猜你喜欢
      • 2013-09-10
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      相关资源
      最近更新 更多