0

在我的项目中链接期间我有一个奇怪的行为。

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

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 文件(显然,根据我的研究,这是一个常见错误) - 在这些文件中实现的类在两个文件中具有不同的名称 - 请注意,该库实际上是作为框架包装的,但这不是问题,因为我在图书馆工作了一段时间而没有遇到这个问题。

提前谢谢!

4

2 回答 2

0

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

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

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

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

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

@interface myClass2 () {
   int localInstanceVar1;
   NSInteger *localInstanceOjbekct2;
}
于 2013-02-26T14:22:17.267 回答
0

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

我的代码在我的 .m 文件中定义了一个方法,如下所示:

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

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

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

于 2013-02-27T21:00:43.440 回答