Проблемы с 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