Ошибка связывания Objective-c с ошибкой дублированного символа - PullRequest
1 голос
/ 19 мая 2011

Я знаю, что здесь есть вопросы, похожие на эти, но я не смог разобраться.

У меня есть представление, которое имеет это в .m над реализацией

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

Все работает нормально, но у меня есть другое представление, которому необходим доступ к той же функции, если я помещаю ее в файл /mus / 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 ]

3 голосов
/ 19 мая 2011

Ваша функция объявляется и определяется в глобальной области видимости.Когда вы помещаете одно и то же определение функции в два разных файла .m, вы получаете две разные функции (с точки зрения компилятора), которые имеют одно и то же имя в одной и той же области видимости (глобальном), оставляя его без возможностизная, кого вы намереваетесь назвать, когда говорите CopyImagePixels(myImage);.Отсюда и сообщение об ошибке.

Так что есть пара вариантов.Одним из них является определение вашей функции как закрытой функции-члена для объектов, которые ее используют, например:

@implementation MyClass

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

@end

Другой (и менее предпочтительный) вариант - переместить вашу функцию объявление вфайл общего заголовка, например MopalAppDelegate.h, и его реализация в ваш MopalAppDelegate.m файл.Это создает объявление функции, которое может быть передано другим классам, с одним определением в файле .m.

1 голос
/ 19 мая 2011

Вы хотите поместить определение функции в заголовок, который разделяют оба файла, внедрить его в соответствующий файл .m и импортировать этот заголовок в оба представления.

Но если это все, что делает функция, почему бы просто не вызвать CGDataProviderCopyData напрямую в обоих местах?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...