Проблемы с Object-C++ и Framework

У меня есть этот проект, который должен интегрировать Box2D, Cocos2d-iPhone и iPhone воском. Сначала я соединил cocos2d-iphone и box2d, и это выдает мне следующее сообщение об ошибке:

    fatal error: 'cassert' file not found
    #include <cassert>
             ^

И я искал и обнаружил, что это потому, что box2d написан на C++, и вы должны установить все исходные файлы, ссылающиеся на box2d, на *.mm, чтобы компилятор apple мог скомпилировать его как object-C++.

Поэтому я просто изменил все исходные файлы на *.mm, и это сработало.

А потом я попытался вставить в него воск для iPhone. Воск для iPhone написан на объектах c и c. И они обеспечивают восковые рамки. Поэтому я загружаю его и перетаскиваю в зону фреймворков моего проекта. И это дает мне эту ошибку:

     "__Z9wax_startPcPFiP9lua_StateEz", referenced from:
          _main in main_old.o
    ld: symbol(s) not found for architecture armv7
    clang: error: linker command failed with exit code 1 (use -v to see invocation)

поэтому я снова ищу и обнаруживаю, что из-за того, что ожидаемой библиотеки не существует. И я проверяю список за списком, и я почти уверен, что все настройки верны, и я не смог найти проблему.

Итак, я сделал тест. Я создаю новый и типовой проект из одного из этих шаблонов, и я добавляю в него воск для iPhone, и он отлично работает. А затем я изменил файл main.m в main.mm, и он выдает ошибку, как указано выше.

Так как мне это исправить? Это потому, что object-C++ не может импортировать инфраструктуру object-c и c? Должен ли я просто воссоздать рамки и изменить все их имена на *.mm? Или я сделал неправильно, когда я изменил мои исходные файлы на *.mm, и должен быть лучший способ решить это?

2 ответа

Решение

Эта функция на самом деле называется функцией wax_start(), Все остальное дерьмо - искажение имен, добавленное компилятором C++. Это необходимо для поддержки перегрузки, т.е. другая хрень кодирует параметр и возвращает типы wax_start(), Самый простой способ исправить это - сообщить компилятору C++, что все в этом заголовке чисто C, например

extern "C"
{
 #import "Wax/whatever.h"
}

Не используйте main.mm, но придерживайтесь main.m. Нет необходимости переименовывать main.m для Box2D. Это работает, потому что вы обычно не включаете / не импортируете какие-либо заголовки Box2D (C++) в main.m.

Если вы добавляете файлы заголовков Box2D (C++) в заголовок своего префикса, убедитесь, что они включены только в файлы C++ (Objective-C++), например так:

// C++ header files
#ifdef __cplusplus
#import "Box2D.h"
#endif // __cplusplus
Другие вопросы по тегам