2011-05-18 94 views
1

连接错误,我知道上有问题在这里与此类似,但我一直没能整理出来。Objective-C的重复的符号错误

我有了这个在执行

CFDataRef CopyImagePixels(CGImageRef inImage){ 
    return CGDataProviderCopyData(CGImageGetDataProvider(inImage)); 
} 

一切正常,上述.M一个观点,但我有需要访问相同功能的另一种观点认为,如果我把它放在/是/意见.m文件,同一地点..编译器会引发重复的符号错误..

这两个的共同点是,它们包括唯一的文件是:

#import "MopalAppDelegate.h" 

我想马YBE将在AppDelegate中的代码,而是抛出了同样的错误,当我试图建立..

我还是很新的OBJ-C,有什么建议将不胜感激。

谢谢。

编辑:错误:

ld: duplicate symbol _CopyImagePixels in /Users/critter/Library/Developer/Xcode/DerivedData/Mopal-dtgtjbahdowmuderbstlmsiznwsi/Build/Intermediates/Mopal.build/Debug-iphonesimulator/Mopal.build/Objects-normal/i386/ViewerController.o and /Users/critter/Library/Developer/Xcode/DerivedData/Mopal-dtgtjbahdowmuderbstlmsiznwsi/Build/Intermediates/Mopal.build/Debug-iphonesimulator/Mopal.build/Objects-normal/i386/StudyListDetailController.o for architecture i386 
collect2: ld returned 1 exit status 
Command /Xcode4/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1 

回答

3

您的功能正在申报,并在全球范围内定义。当您将相同的函数定义放在两个不同的.m文件中时,最终会出现两个不同的函数(就编译器而言),它们在相同的作用域(全局)中具有相同的名称,而无法知道哪个函数当你说CopyImagePixels(myImage);时,你打算打电话给你。因此错误信息。

因此,有几个选项。一个是定义用作在使用它,像中的对象的私有成员函数:

@implementation MyClass 

- (CFDataRef) copyImagePixels: (CGImageRef)inImage { 
    return CGDataProviderCopyData(CGImageGetDataProvider(inImage)); 
} 

@end 

另一个(和较不优选的)的选择是声明移动您的功能到共享头文件中,像MopalAppDelegate.h,其实施到您MopalAppDelegate.m文件。这会创建一个函数声明,可以通过.m文件中的单个定义将其分配给其他类。

+0

看到..我甚至不知道那里/是/全球范围。感谢您的回复。 – Critter 2011-05-20 20:16:30

1

你想要把函数定义在一个头两个文件共享,实现它在相应.m文件,以及头到两个观点进口。

但是,如果这是所有的功能呢,为什么不直接叫CGDataProviderCopyData直接在这两个地方?

+0

是的。这就说得通了。我从来没有想过直接打电话给它......这是那些日子之一..谢谢 – Critter 2011-05-19 00:04:46

+0

你应该把函数*声明*放在这两个文件共享的头文件中。这个定义应该只在一个地方进行。 – Chuck 2011-05-19 00:07:32

+0

@Chuck gotcha。谢谢。 – Critter 2011-05-19 00:09:57