Компиляция кода C внутри кода C++ внутри кода Objective-C++
Моя проблема немного сложна:
Библиотека: у меня есть библиотека, написанная на C и C++. Он идеально компилируется в XCode с Apple LLVM. Работа самой библиотеки выполняется кодом C, в то время как часть C++ - это просто интерфейс C++, потому что я предпочитаю C++. В теории мне нужно использовать только C++ для общения с ним.
Приложение: у меня есть приложение в Objective-C, которое использует библиотеку выше. Конечно, поскольку связь с моей библиотекой осуществляется через C++, мне нужен файл.mm для вызова моей библиотеки из "Objective-C++".
Во время компиляции... происходит несколько языков "C":
- ошибка: неконстантный статический член данных должен быть инициализирован вне строки
- ошибка: выражение оператора не допускается в области видимости файла
- так далее...
Это происходит только с Objective-C++
- Objective-C++ (приложение) -> заголовки C++ (lib) -> заголовки C (lib, с внешним "C") -> НЕ ОК!!! ЗАЧЕМ?
Если я сделаю еще одно приложение C++ для тестирования библиотеки, все пойдет нормально
- C++ (приложение) -> C++ (lib) -> заголовок C (lib, с внешним "C") -> ОК
Подробно: я всегда использую компилятор Apple LLVM здесь
Вопрос: как мне скомпилировать код C из C++ из кода Objective-C++? Почему это отличается от компиляции из обычного кода C++?
2 ответа
После долгого периода попыток и Google я наконец смог разобраться. Прежде чем я вызову свои заголовки C, я должен определить макросы MAX и MIN. По какой-то причине они были определены ранее. Компилятор не показывает ошибку с точностью. Вот почему это было сложно. Я использую платформу C, которая имеет собственное объявление макросов MAX и MIN...
Еще одна очень интересная вещь, которая может быть полезна для других, состоит в том, что прежде чем нам нужно сделать то же самое: отменить определение max и min (нижний регистр), если мы используем какую-то C-среду, которая реализует свои собственные max и min.
Это решило обе проблемы.
Не забывай делать
#ifdef __cplusplus
extern "C" {
#endif
<Some C method declaration>
#ifdef __cplusplus
}
#endif
в ваших заголовочных файлах, которые содержат объявления метода C.