Как добавить Box2d в существующий проект Xcode/Cocos2d

У меня есть рабочий проект Xcode, который включает Cocos2d в одном из представлений. Теперь мне нужно добавить Box2d. Я попытался перетащить папку Box2D в каталог libs моей папки cocos2d-2.x-ARC-iOS и добавить к этой цели, но при компиляции получаю следующее:

(in b2BroadPhase.cpp)
'Box2D/Collision/b2BroadPhase.h' file not found

Я уверен, что это только первая из многих ошибок, которые я получу. Какой шаг мне не хватает, чтобы собрать все файлы Box2d в моем проекте?

Все файлы box2d перечислены в источниках компиляции для цели cocos2d-library.

И почему это так сложно сделать? Почему она не работает, как любая другая библиотека?

И - нужно ли мне переименовывать каждый отдельный .m в моем проекте в .mm? Это почти невозможно, так как это большой проект xcode со многими файлами. Я просто пытаюсь использовать Box2d в одном представлении.


Дополнительная информация в ответ на ответ, данный LearnCocos2D-

Моя структура папок (в Finder) выглядит так:

Root = MyProject.xcodeproj, папка MyProject, папка cocos2d-2.x-ARC-iOS В папке cocos2d-2.x-ARC-iOS есть папка с именем libs. Внутри этой папки у меня есть папка Box2D, а также Cocos2d, CocosDenshion и т. д.

В XCode у меня есть ПРОЕКТ (MyProject) И 2 ЦЕЛИ (cocos2d-library, MyProject). Существуют «Пути поиска заголовков» как для ПРОЕКТА, так и для ЦЕЛЕЙ. Какой мне поставить? И должен ли он быть рекурсивным или нет? И когда я перетаскиваю папку Box2D в Xcode, какую цель я устанавливаю?

Файл моего проекта находится в папке /Users/me/Dropbox/iOS/MyProject. Итак, что именно я ввожу для пути поиска заголовков? /Users/me/Dropbox/iOS/MyProject/cocos2d-2.x-ARC-iOS/libs не работает.


Еще одно обновление - /Users/me/Dropbox/iOS/MyProject/cocos2d-2.x-ARC-iOS/libs, так как путь поиска заголовков в MyProject TARGET, похоже, помогает мне преодолеть ошибки Box2D. Затем у меня была ошибка «cassert», файл не найден. Преодолели это, изменив контроллер представления, его родителя и AppDelegate на тип файла «Источник Objective-C++», как вы предложили. И сейчас...

Теперь у меня есть множество ошибок в NSObjCRuntime.h, NSZone.h, NSObject (ожидаемый неквалифицированный идентификатор, неизвестное имя типа «NSString» и т. д.). Таким образом, создается впечатление, что вы либо создаете приложение с помощью Box2d/Cocos2d, либо приложение UIKit. Попытка иметь и то, и другое — полный кошмар.


person soleil    schedule 02.03.2013    source источник


Ответы (3)


Самое простое решение: начать новый проект с уже интегрированным Box2D. Затем добавьте к нему исходные файлы и ресурсы. Поверьте, легче не станет.

Пара вещей, которые мне пришли в голову, которые необходимы для Box2D:

В качестве пути поиска используйте путь к файлу Box2D.h минус один уровень. Хорошо, это нуждается в лучшем объяснении:

Если Box2D.h находится в /Projects/MyProject/libs/Box2D

… тогда путь поиска должен быть /Projects/MyProject/libs

Это связано с тем, что операторы Box2D #include всегда включают путь Box2D:

#include <Box2D/Common/b2Settings.h>

Таким образом, путь поиска заголовков плюс путь #include/#import должны давать полный путь к файлу:

/Projects/MyProject/libs/Box2D/Common/b2Settings.h

Тогда легко проверить, правильно ли вы указали путь поиска или нет.

Обязательно добавьте путь поиска в Путь поиска заголовка, а не в параметр Путь поиска заголовка пользователя, как для других библиотек. Это связано с тем, что Box2D использует угловую скобку <file.h>. Большинство других библиотек вместо этого используют "file.h", которые используют путь поиска заголовков пользователя для поиска своих файлов заголовков.

Почему это сложно? Настройки компилятора. Их много. Ошибки и предупреждения не всегда очевидны. На самом деле, это норма. И множество способов написать и добавить код. О, так много разных языков и языковых версий. В основном это вопрос опыта. На 5 уровне и выше становится легче, на 10 уровне просто неприятно. :)

Вы должны переименовать каждый файл .m, который включает Box2D, либо напрямую (#import "Box2D.h"), либо косвенно (включая заголовок, который включает Box2D). Если вы добавите заголовок Box2D в файл Prefix.pch, это будет то же самое, что включить его в каждый файл, поэтому я бы не стал этого делать в вашей ситуации.

Вы можете избежать переименования, установив тип файлов .m в Xcode на «Objective-C++». Хотя это будет так же утомительно, если не больше. Совет: есть хорошие инструменты для массового переименования файлов именно для таких ситуаций.

person LearnCocos2D    schedule 02.03.2013
comment
Большое спасибо за попытку помочь. Я собираюсь объяснить свою текущую попытку в редактировании моего исходного вопроса, потому что я все еще получаю ту же ошибку. - person soleil; 03.03.2013
comment
Я внес изменения выше. Не могли бы вы также уточнить, как проверить, правильно ли я указал путь поиска? Я не понял эту часть вашего ответа. Спасибо! - person soleil; 03.03.2013
comment
Минус один уровень, потому что Box2D уже включает папку Box2D в путь поиска, и это заставило меня наконец работать! И не забудьте указать путь поиска между ними, например, если Box2D находится в папке вашего проекта, $(SRCROOT) поможет - person Nicolas Manzini; 04.08.2013
comment
Должен быть более простой способ добавить существующую библиотеку. - person jeet.chanchawat; 13.11.2014

Добавьте это к путям поиска заголовков и посмотрите, как работает волшебство: $[PROJECT_DIR]

person user371260    schedule 09.06.2014

У вас могут быть следующие ошибки компиляции:

  1. «Файлы заголовков не найдены»: решение заключается в изменении пути поиска пользовательского заголовка, чтобы включить каталог Box2D. Если вы поместите Box2D в каталог вашего проекта, вы можете использовать следующую переменную среды ${PROJECT_DIR}. Не забудьте проверить «рекурсивный». ПРИМЕЧАНИЕ. Удалите все ссылки на Box2D из пути заголовка. Например: TestGame/Libraries/Box2D -> ${PROJECT_DIR}/TestGame/Libraries

  2. Не найдены файлы заголовков Cpp, такие как <cassert> ...: переименуйте файл с расширением *.mm вместо *.m, чтобы решить эту проблему.

person Hiep Huynh Ngoc    schedule 27.06.2015