Как мне связать мою программу objc с библиотекой objC++?
У меня есть программа objc, и я хотел бы использовать виджет, который написан на objC++ (а именно https://launchpad.net/scintilla-cocoa). Как мне это сделать? По сути, я хочу, чтобы новый объект контроллера окна взаимодействовал с этой библиотекой objC++ для определения виджета текстового редактора Scintilla. Простое создание нового класса objc и доступ к библиотеке оттуда порождает кучу ошибок, связанных с C++ class
Ключевое слово и так далее.
заранее спасибо
2 ответа
Так как я тот, кто поставил вас в (надеюсь, полезное:-)) проблему использования Scintilla, я здесь.
Допустим, мы создаем ScintillaView
подкласс, названный ppScintillaEditor
, Файл должен иметь .mm
расширение (например, ppScintillaEditor.mm
)
Код будет примерно так...
Интерфейс
#import "Scintilla/ScintillaView.h"
@interface ppScintillaEditor : ScintillaView
{
// your iVars
}
// your properties / methods / whatever
Теперь, что касается части реализации, не забудьте поместить некоторый метод инициализации, чтобы правильно настроить представление (как в примере, сопровождающем Scintilla-cocoa; я имею в виду проект Test)
Sidenote: Конечно, вы можете создавать подклассы, категории или что-то еще поверх ScintillaView
класс, в значительной степени основанный на том, что вам нужно - я, например, я создал отдельную категорию только для того, чтобы сгруппировать там некоторые ScintillaView
конкретные команды (рано или поздно, вы заметите, что для некоторых более сложных манипуляций со Scintilla, хотя они есть, может потребоваться некоторая полировка, чтобы быть немного более дружественной к какао, так что вы идете...)
Теперь последнее, но не менее важное...
Чтобы решить "bunch of errors related to the C++ class keyword and so on"
Как я показал в своем другом видео-ответе на ваш комментарий, все, что вам нужно сделать, это:
- Перейдите в настройки сборки вашего проекта
- Под Apple LLVM Compiler 3.0 - Предварительная обработка
- Опция препроцессора Макросы
Добавьте как к Debug, так и к Release:
SCI_NAMESPACE SCI_LEXER
И это все.:-)
Подсказка: вышеизложенное определено Scintilla, чтобы избежать столкновений между элементами C и не-C, как указано выше... так что все, что нужно, это уведомить препроцессор, а все остальное позаботится о....
Вы должны создать класс objc, который имеет интерфейс, необходимый вашему приложению, затем реализовать и добавить ivars и реализовать - все это за брандмауэром компиляции, поэтому исходные тексты objC++ не включаются в заголовок. Ваша реализация обеспечит любые необходимые преобразования.
это похоже на то, что вы уже сделали, но вы удаляете заголовки сцинтиллы из заголовка для вашей оболочки - они видны только для реализации вашей оболочки.
Обновить
Чтобы проиллюстрировать один из возможных подходов:
MONScintillaWrapper.h
// no c++/scintilla sources should be included in this header
#import <Foundation/Foundation.h>
@interface MONScintillaWrapper : NSObject
- (void)setBackgroundColor:(NSColor *)pColor;
@end
MONScintillaWrapper.mm
#import "MONScintillaWrapper.h"
@implementation MONScintillaWrapper
{
scintilla::t_thing scintillaThing;
}
- (void)setBackgroundColor:(NSColor *)pColor
{
...convert pColor to a scintilla color and pass that to scintillaThing...
}
@end