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

StackOverflow https://stackoverflow.com/questions/1233381

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top