链接时出现奇怪错误:重复符号_comparePutFoldersFirst

时间:2013-02-26 14:05:00

标签: ios objective-c xcode linker clang

我在项目链接过程中遇到了奇怪的行为。

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

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文件(显然是基于我的研究的常见错误) - 在这些文件中实现的类在两个文件中都有不同的名称 - 请注意,库实际上被包装为一个框架,但这不是问题,因为我在没有这个问题的情况下使用了一段时间。

谢谢你!

2 个答案:

答案 0 :(得分:0)

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

但有时候,当你没有准确地工作时,可能会发现这些变量实际上是静态的甚至是全局的。 也就是说,它们只是在mehod之间或@implementation和方法体之间的开放空间中被激活。

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

快速和肮脏:只需重命名其中一个。 正确地:重新构建您的代码。可以将它们收集在@interface之后的.h文件中并将它们括在括号中。

如果您不想在.h文件中使用它们,请使用空类别开始您的.m文件:

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

答案 1 :(得分:0)

基于@Hermann的评论,我发现了这个问题(实际上并不复杂:S)

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

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

这种方法显然会产生一个负责冲突的全局符号。

我正在使用该方法对数组进行排序,因此我将其更改为块并且问题消失了。