Я пишу плагин для браузера для Mac OS, который будет помещать значок строки состояния в строке состояния, который пользователи могут использовать для взаимодействия с плагином браузера. Я успешно построил проект FireBreath 1.6 в XCode 4.4.1 и могу установить его в браузере. Однако FireBreath использует C ++, тогда как подавляющее большинство существующих библиотек для Mac OS написаны на Objective C.
В файле /Mac/projectDef.make я добавил Cocoa Framework и Foundation Framework, как было предложено Вот и в других ресурсах, которые я нашел в Интернете:
target_link_libraries(${PROJECT_NAME}
${PLUGIN_INTERNAL_DEPS}
${Cocoa.framework} # added line
${Foundation.framework} # added line
)
Я перезапускаю prepmac.sh, ожидая, что в XCode будет создан новый проект с моими файлами .mm и .m; однако, кажется, что их игнорируют. Я вижу только файлы .cpp и .h. Я добавил правила для них в файл projectDef.make, но, похоже, это не имеет значения:
file (GLOB PLATFORM RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
Mac/[^.]*.cpp
Mac/[^.]*.h
Mac/[^.]*.m #added by me
Mac/[^.]*.mm #added by me
Mac/[^.]*.cmake
)
Даже если я добавлю файлы вручную, я получу серию ошибок компиляции. Их около 20, все они связаны с файлом NSObjRuntime.h
файл:
Parse Issue - Expected unqualified-id
Parse Issue - Unknown type name 'NSString'
Semantic Issue - Use of undeclared identifier 'NSString'
Parse Issue - Unknown type name 'NSString'
...
...
Semantic Issue - Use of undeclared identifier 'aSelectorName'
...
...
Semantic Issue - Use of undeclared identifier 'aClassName'
...
Так продолжается некоторое время с похожими ошибками …
Из того, что я прочитал, эти ошибки появляются из-за зависимостей от Foundation Framework, которые, я полагаю, я включил в проект. Я также попытался щелкнуть проект в XCode
Я дошел до того, что сейчас не уверен, что попробовать дальше. Люди говорят, что использовать Objective C в коде C / C ++ несложно, но, будучи новичком в XCode и Objective C, я могу запутаться. Это только 4-й день для меня на этой новой платформе.
Что мне нужно сделать, чтобы XCode компилировал код Objective C? Пожалуйста, помните, что я немного новичок в этом, поэтому я был бы признателен, если вы оставите подробные ответы, а не расплывчатые строки, которые часто встречаются в firebreath тег. Я просто немного над головой, но если ты сможешь преодолеть это препятствие, я уверен, что мне будет хорошо идти оттуда.
ОБНОВИТЬ:
Я отредактировал проекты / MyPlugin / CMakeLists.txt и добавил туда также правила .m и .mm. после запуска prepmac.sh файлы включаются в проект, но я по-прежнему получаю те же ошибки компиляции.
Я переместил все файлы .h и .mm из кода Obj C в корневую папку MyPlugin и перезапустил файл prepmac.sh. Проблема все еще существует. Те же ошибки компиляции.
Ваша проблема в том, что у вас есть файлы .h, которые включаются в файлы C ++ с целевым типом c и / или включаются в них. Чтобы сделать то, что вы хотите, все ваши классы, используемые c ++, должны либо хранить все связанные с объектами вещи в #ifdef, либо просто не предоставлять ничего obj c в заголовочном файле.
Например, вы можете использовать этот ifdef в своем заголовке:
#ifdef __OBJC__
// Objective C / C++ code here
#endif
Важно помнить, что .h файлы включает в себя а также заголовочные файлы, так что они на самом деле включены. Если вы включаете объективный код c в файл .cpp, компилятор запутывается и плачет.
РЕДАКТИРОВАТЬ: Самое важное, что нужно помнить, это то, что вам нужно убедиться, что любые файлы заголовков c (или другие файлы с кодом c) не включены в файлы cpp. Если вы можете сделать это, вы будете в порядке.
Других решений пока нет …