Как устранить ошибки ссылок, которые появляются в Objective-C ++, но не в Objective-C? - PullRequest
4 голосов
/ 10 августа 2010

Я преобразую свой файл делегата приложения из .m в .mm (Objective-C в Objective-C ++), чтобы я мог получить доступ к сторонней библиотеке, написанной на Objective-C ++. В Objective-C мой делегат приложения собирается и работает нормально. Но когда я меняю расширение, проект компилируется, и я получаю ошибки ссылок, во всех из которых отсутствуют символы из статической библиотеки, написанной на C, который я использую. Ошибки являются классическими ошибками ссылок в следующем формате:

"MyFunction (arguments)", на которую ссылаются из:

- [MyAppDelegate myMethod] в MyAppDelegate.o

Символ (ы) не найдены

Все проблемы в объекте делегата приложения. Я знаю, что все готово для компиляции Objective-C ++, потому что мой файл ViewController - .mm. Так что мой вопрос состоит из нескольких частей.

Во-первых, действительно ли нет этих символов в том смысле, что я не могу их использовать? Другими словами, нельзя ли получить доступ к простым старым функциям C из файла Objective-C ++? Если это правда, это довольно неудачно. Я думал, что почти весь код Objective-C, и, конечно, весь код Objective-C, который по крайней мере собирается как .mm, был допустимым Objective-C ++. Я не прав?

Если нет, есть идеи, как я могу предотвратить эти ошибки? Существуют ли в Objective-C ++ правила заголовков, о которых я не знаю?

Спасибо за любую помощь.

Ответы [ 2 ]

8 голосов
/ 10 августа 2010

Ошибки связи со смешанными программами на C ++ / C или C ++ / Objective-C обычно связаны с искажением имен на C ++.Убедитесь, что у вас есть extern "C", прикрепленный ко всем соответствующим объявлениям, а также, что весь ваш код соответствует соглашению.То есть убедитесь, что определение функции, а также места, где она используется, могут видеть extern "C" или extern "C++".

В вашей конкретной ситуации похоже, что MyFunction() компилируетсяс привязкой к C ++ и с искаженным именем, но ваш файл myMethod Objective-C пытается связать его с не исправленным именем.

Вот ссылка на статью в Википедии о искажение имени .

3 голосов
/ 10 августа 2010

Окружение вашего заголовка включает extern C.

Это говорит компоновщику, что имена функций в библиотеке не получают C ++ имя искажения.

Например:

 extern "C" {
   #include "my-lib.h"
 }
...