Objective-c链接错误与重复符号错误

时间:2011-05-18 23:53:01

标签: iphone objective-c xcode ipad

我知道这里有类似的问题,但是我无法解决这个问题。

我有一个观点,在实现上面的.m中有这个。

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

一切正常,但是我有另一个需要访问同一个函数的视图,如果我把它放在/ that / views .m文件中,同一个位置..编译器会抛出一个重复的符号错误..

这两者的唯一共同点是:

#import "MopalAppDelegate.h"

我想可能会把代码放在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

2 个答案:

答案 0 :(得分:3)

您的函数正在全局范围内声明和定义。当您将相同的函数定义放在两个不同的.m文件中时,最终会得到两个不同的函数(就编译器而言)在同一作用域(全局)中具有相同的名称,而不是当你说CopyImagePixels(myImage);时,知道打算打电话的方式。因此错误信息。

所以有几种选择。一种是将您的函数定义为使用它的对象上的私有成员函数,如:

@implementation MyClass

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

@end

另一个(也不太喜欢)选项是将您的函数声明移动到共享头文件,如MopalAppDelegate.h及其实现到您的{ {1}}文件。这创建了一个函数声明,可以与MopalAppDelegate.m文件中的单个定义共享给其他类。

答案 1 :(得分:1)

您希望将函数定义放在两个文件共享的标头中,在相应的.m文件中实现它,并将该标头导入两个视图。

但如果这就是所有功能,那么为什么不直接在两个地方都拨打CGDataProviderCopyData