связывание и использование библиотеки C ++ с приложением Objective-C - PullRequest
9 голосов
/ 05 августа 2009

Я пишу графическое приложение, используя Objective-C для внешнего интерфейса и C ++ для обработки графики и сетевого взаимодействия. Я читал на сайте Apple в поисках способа связать либо .dylib , либо .so с моим кодом C ++ в моем проекте Xcode, но, похоже, ничего не получалось. Я смог заставить проект ссылаться на него и ссылаться на него, но когда я пытался вызывать функции из этого .dylib, он говорил, что не знает, что я пытаюсь сделать. Кто-нибудь знает, что здесь происходит?

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

Спасибо, Робби

Ответы [ 2 ]

15 голосов
/ 05 августа 2009

Большинство проектов, над которыми я работаю, имеют внешний интерфейс ObjC и C ++. Если вы имеете дело исключительно с функциями, то исправление имени Дейва Гэмбла правильно, но если вы имеете дело с более сложными ситуациями, когда вам нужно иметь дело как с объектами ObjC, так и с C ++, лучше всего заключать в оболочку объекты C ++ в объектах ObjC. Используя непрозрачные ссылки (это очень необычный способ сказать void*), вы на самом деле можете обойти объекты C ++ в ObjC и наоборот. У меня есть пример кода , который может быть полезен.

Тем не менее, для графики вы, вероятно, сильно пострадаете от производительности, выполняя пользовательский C ++ вместо использования Core Image и связанных с ним фреймворков. Базовое изображение и другие графические фреймворки высоко оптимизированы для Mac, и вы вряд ли добьетесь большего успеха с C ++, написанным вручную (или даже с очень хорошо написанным C ++, который не предназначен специально для Mac). Когда вы перейдете на 10.6 и начнете централизованную диспетчеризацию, разница в производительности будет еще более ощутимой, потому что в противном случае вы потеряете все преимущества параллелизации, которые вы получили бы бесплатно. Это не имеет ничего общего с ObjC; Базовое изображение - это C. Вы можете называть его из C ++ как хотите. Я просто не рекомендую обрабатывать пользовательскую графику на Mac на любом языке, если вам не нужна мобильность или если у вас есть опыт, необходимый для победы над Core Image.

14 голосов
/ 05 августа 2009

Вы столкнетесь с одним препятствием в форме так называемого искажения имени. C ++ сохраняет имена функций способом, несовместимым с Obj-C.

Objective-C не реализует классы так же, как C ++, поэтому он не понравится.

Одним из способов решения этой проблемы является реализация набора простых функций C, которые вызывают функции C ++. Будет очень сложно сохранить как можно меньше функций C! Вы получите красивый компактный интерфейс! :)

Чтобы объявить эти функции в файле C ++, вам нужно пометить их как C с помощью:

extern "C" int function_name(char *blob,int number, double foo) {...}

Это отключает стандартное искажение имен.

Создайте файл заголовка с прототипами для всех этих функций, которыми вы можете поделиться с вашим целевым кодом C.

Вы не сможете передавать классы таким же образом (потому что ваш код ObjC не может их использовать), но вы сможете передавать указатели (хотя вам, возможно, придется немного лгать о типах ).

...