Как преобразовать сложный проект C ++ XCode в приложение Какао? - PullRequest
3 голосов
/ 13 января 2011

У меня есть исходный код для относительно сложного приложения C ++, которое включает в себя множество библиотек, зависимостей и т. Д. Я пытаюсь взять его и добавить графический интерфейс Cocoa.До сих пор мне не удавалось следующее:

  • Создайте новый Cocoa xcodeproj и попробуйте переместить все библиотеки и т. Д. В приложение Cocoa.Я просто не могу заставить его строить.Тысячи ошибок, независимо от того, что я делаю.Мои навыки здесь просто не достаточно хороши, чтобы понять, что происходит.

Итак, я думаю, что более простой метод должен состоять в том, чтобы внести соответствующие изменения в C ++ xcodeproj, чтобы сделать основной() Функция запускает NSApplication вместо того, что она делает прямо сейчас.

Кто-нибудь знает, что я должен был бы сделать именно для того, чтобы это произошло?Я новичок в Какао, поэтому я не уверен, что я должен был бы добавить.Для справки, main.cpp приложения C ++ на самом деле очень прост:

int main() {
    ofSetupOpenGL(320,300, OF_WINDOW);
    ofRunApp(new testApp());
}

Я хотел бы сделать все необходимые изменения, чтобы это могло быть:

#import <Cocoa/Cocoa.h>

int main(int argc, char *argv[]) {
    return NSApplicationMain(argc,  (const char **) argv);
}

И пусть старый xcodeproj компилируется со всеми «вещами», все еще находящимися в нем, а затем, когда он запускается, откройте окно Какао.

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

Есть идеи?

(Или, альтернативно,если вы знаете, как я мог бы легко получить весь материал из C ++ xcodeproj для создания скрипучего чистого Cocoa xcodeproj, дайте мне знать, но сейчас мне это кажется более сложным.)

Спасибо!

Ответы [ 4 ]

1 голос
/ 15 января 2011

Скорее всего, это не пройдет гладко, если вы не знаете c ++ или аналогично, какао.

В противном случае, большая часть перехода будет монотонной, если вы действительно знаете, чтоты делаешь.в противном случае подготовьтесь сначала к изучению objc.

: не беспокойтесь о преобразовании работающей программы на языке c ++ в objc.это огромная трата времени.Вы просто оборачиваете, связываете и изменяете программу для работы в этом контексте.вам не нужно писать все в objc.

секунда: вам придется написать некоторые привязки / оболочки objc, чтобы использовать программу c ++.у вас будет некоторая упаковка, особенно для элементов пользовательского интерфейса и пользовательских событий.

третий: исходные тексты должны компилироваться как есть.вы просто добавляете их в свой новый проект шаблона какао, и gcc по умолчанию скомпилирует его как файл cpp, если он имеет распознанное расширение c ++.чтобы использовать c ++ и objc, используйте objc ++ FILENAME.mm (вы также можете использовать .M, но это также не поддерживается).еще лучше, поместите исходные исходники cpp в отдельную библиотеку, на которую приложение ссылается.

четвертый: теперь, когда у вас есть шаблон проекта какао и компилируются исходники cpp, добавьте оболочки / привязки, чтобы события cocoa /рисование выполняет в этом контексте.Исходя из вашего примера кода, ваша отправная точка использует Open GL, поэтому вам нужно использовать что-то вроде NSOpenGLView, если вы хотите приложение Какао.что именно вам нужно реализовать, зависит от проекта.

ваша основная функция должна вызывать NSApplicationMain, тогда ваши начальные записи для записи привязок в код c ++, вероятно, будут обрабатывать события, NSWindow, NSView и, возможно,NSApplication.

если вы новичок в objc, у вас, вероятно, будет небольшое ускорение.

1 голос
/ 13 января 2011

Ну, у меня есть две идеи ...

  1. Вам действительно нужно какао? Поддержка Mac может быть добавлена ​​с помощью QT, wxWidgets и других.
  2. Вам не нужно переносить каждую строку C ++ в Objective-C ++. Objective-C ++ может легко обрабатывать код C ++. Вам просто нужно изменить .cpp -> .mm и, конечно, переписать некоторый код относительно пользовательского интерфейса. Я думаю, что лучший способ здесь - создать пустое приложение Cocoa из XCode и постепенно заполнять его старым кодом. Сначала получите материал OpenGL, работающий с приложением Cocoa, а затем перенесите код C ++, переименовывая файлы.

Подсказка : Вы можете покрыть некоторую часть вашего кода «пустыми объявлениями», то есть определить пустой макрос вместо реальной функции, поместить некоторые пустые классы с пустыми методами, если они действительно необходимы. Получение всего материала для компиляции - это первый и большой шаг. Когда все скомпилируется - поместите в проект другую часть реального кода и исправьте его для компиляции.

К сожалению, я не знаю лучшего решения. Я пересматривал огромные проекты несколько раз, и каждый раз, на каждой платформе и языке (ах) программирования, рецепт был один и тот же. Удачи!

0 голосов
/ 13 октября 2011

Несмотря на то, что это старый пост, я еще не видел этот ответ.

Ваш код

int main() {
     ofSetupOpenGL(320,300, OF_WINDOW);
     ofRunApp(new testApp()); 
}

Похоже на код Open Frameworks. Почему бы вам не загрузить версию Open Frameworks Mac XCode здесь и попытаться поместить свои исходники в один из их примеров проектов. Например, OpenGL flockingExample?

0 голосов
/ 15 января 2011

Я пишу подобное приложение, но поскольку я намерен сделать его кроссплатформенным (в первую очередь для Mac, а затем для Windows), я намеренно сохраняю бэкэнд в виде библиотеки C ++. Затем я предоставлю любой внешний интерфейс GUI (Какао на Mac и MFC на Windows). Преобразование не нужно делать - вам просто нужно интегрировать то, что у вас уже есть.

...