Используйте файл C ++ в Какао iPhone App - PullRequest
0 голосов
/ 25 августа 2009

Я пытаюсь использовать функциональность примера приложения для iPhone AQOfflineRenderTest в своем приложении (это приложение конкретно не важно, я просто подумал, что стоит упомянуть) У меня есть файл C ++ с методом под названием:

    void DoAQOfflineRender(CFURLRef sourceURL, CFURLRef destinationURL)

Я пытаюсь вызвать это из моего класса Какао Objective-C. Пример приложения, на которое я ссылался выше, делает это путем объявления метода в заголовочном файле следующим образом:

    - (IBAction)doSomethingAction:(id)sender;
    @end
    void DoAQOfflineRender(CFURLRef sourceURL, CFURLRef destinationURL);

В файле реализации я вызываю doSomethingAction, который вызывает renderAudio и выполняет тот же код:

    DoAQOfflineRender(sourceURL, destinationURL);

При выполнении я получаю сообщение об ошибке: _DoAQOfflineRender ", на который ссылаются: - [myViewController renderAudio] в myViewController.o символ (ы) не найден collect2: ld вернул 1 статус выхода

Мне не хватает ссылки на этот класс C ++? В примере приложения он не указан, но работает.

Пожалуйста, помогите и спасибо!

Джо

Ответы [ 3 ]

1 голос
/ 25 августа 2009

Чего вам не хватает, так это реализации DoAQOfflineRender - вы забыли добавить ссылку в библиотеку, где определена эта подпрограмма?

0 голосов
/ 25 августа 2009

Чтобы вызвать функцию C ++ из файла C или Objective-C, вы должны объявить ее с extern "C" связью в C ++.

#if __cplusplus
extern "C" {
#endif

void DoAQOfflineRender(CFURLRef sourceURL, CFURLRef destinationURL);

#if __cplusplus
}
#endif

Причина этого заключается в том, что имена функций C ++ изменяются путем кодирования их типов, так что функции с одинаковым именем, но разными сигнатурами становятся разными символами. Например, DoAQOfflineRender(CFURLRef, CFURLRef) становится __Z17DoAQOfflineRenderPK7__CFURLS1_ без extern "C", но _DoAQOfflineRender с ним, чего и ожидает C / Objective-C.

0 голосов
/ 25 августа 2009

Похоже, что вы используете .m как расширение для вашего исходного файла Objective-C, поэтому компилятор считает, что вы ссылаетесь на функцию C. Попробуйте изменить расширение на .mm.

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