2013-03-02 13 views
5

Ich habe ein funktionierendes Xcode-Projekt, das Cocos2d in einer der Ansichten enthält. Ich muss jetzt Box2d hinzufügen. Ich habe versucht, den Box2D Ordner in den Libs Verzeichnis meiner cocos2d-2.x-ARC-iOS Ordner ziehen und das Hinzufügen zu diesem Ziel, aber ich bin immer das, wenn ich kompilieren:So fügen Sie Box2d zu einem vorhandenen Xcode/Cocos2d-Projekt hinzu

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

Ich bin sicher, dass dies ist nur der erste von vielen Fehlern, die ich bekommen werde. Welchen Schritt vermisse ich, um alle Box2d-Dateien in meinem Projekt zu kompilieren?

Alle box2d-Dateien sind in den Kompilierquellen für das cocos2d-Bibliotheksziel aufgeführt.

Und warum ist das so schwer zu tun? Warum funktioniert es nicht wie jede andere Bibliothek?

UND - muss ich jede einzelne .m in meinem Projekt in .mm umbenennen? Das ist ziemlich unmöglich, da dies ein großes xcode-Projekt mit vielen Dateien ist. Ich versuche Box2d nur in einer Ansicht zu verwenden.


Zusätzliche Informationen als Antwort auf die Antwort von LearnCocos2D-

Meine Ordnerstruktur (im Finder) sieht wie folgt aus:

root = MyProject.xcodeproj, MyProject Ordner, cocos2d-2. x-ARC-iOS-Ordner Im Ordner cocos2d-2.x-ARC-iOS befindet sich ein Ordner namens libs. In diesem Ordner ich den Box2D Ordner, zusammen mit Cocos2d, CocosDenshion usw.

In XCode habe ich ein Projekt (MyProject) Und 2 -Ziele (cocos2d-Bibliothek, MyProject) Es gibt "Header-Suchpfade" für sowohl das PROJEKT, als auch die ZIELE. Welche stelle ich ein? Und sollte es rekursiv oder nicht sein? Und wenn ich den Box2D-Ordner in Xcode verschiebe, auf welches Ziel setze ich ihn?

Meine Projektdatei befindet sich unter/Users/me/Dropbox/iOS/MyProject. Was genau gebe ich für den Header Search Path ein? /Users/me/Dropbox/iOS/MyProject/cocos2d-2.x-ARC-iOS/libs scheint nicht zu funktionieren.


Ein weiteres Update - /Users/me/Dropbox/iOS/MyProject/cocos2d-2.x-ARC-iOS/libs als Header-Suchpfad im MyProject TARGET scheint mir vorbei an den Box2D Fehler zu bekommen. Dann hatte ich eine 'Cassert' Datei nicht gefunden Fehler. Durch Ändern des View-Controllers, dessen Elternelement und des AppDelegate zu einem Dateityp von "Objective-C++ Source", wie Sie es vorgeschlagen haben. Und jetzt ...

Jetzt habe ich eine Litanei von Fehlern in NSObjCRuntime.h NSZone.h, NSObject (Erwartete unqualifizierte-id, unbekannter Typ Name 'NSString', etc.). So scheint es, als ob Sie entweder eine App mit Box2d/Cocos2d oder eine UIKit App erstellen. Der Versuch, beides zu haben, ist ein kompletter Albtraum.

Antwort

7

Einfachste Lösung: Starten Sie ein neues Projekt mit Box2D bereits integriert. Fügen Sie dann Ihre Quelldateien & Ressourcen hinzu. Vertrau mir, es wird nicht einfacher.

Ein paar Dinge aus der Spitze von meinem Kopf, die für Box2D erforderlich sind:

Als Suchpfad den Pfad zum Box2D.h minus eine Ebene Datei verwenden. Ok, das braucht eine bessere Erklärung:

Wenn Box2D.h ist in /Projects/MyProject/libs/Box2D

... dann soll Suchpfad /Projects/MyProject/libs

Dies liegt daran, dass seine Box2D # include-Anweisungen sind immer den Box2D Pfad:

#include <Box2D/Common/b2Settings.h> 

Zusammengefasst der Header-Suchpfad und die # include/# Importpfad sollte den vollständigen Pfad zur Datei angeben:

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

Dann ist es einfach zu prüfen, ob Sie den Suchpfad r erhalten haben Licht oder nicht.

Achten Sie darauf, den Suchpfad zu Kopfzeilensuchpfad hinzuzufügen und nicht die Suchpfade des Benutzerkopfsatzes wie bei anderen Bibliotheken. Dies liegt daran, dass Box2D Winkelklammer <file.h> enthält. Die meisten anderen Bibliotheken verwenden stattdessen "file.h", die den Header-Suchpfad des Benutzers verwenden, um ihre Header-Dateien zu finden.

Warum ist es schwierig? Compilereinstellungen Es gibt viele von ihnen. Fehler und Warnungen sind nicht immer offensichtlich. Eigentlich ist das die Norm. Und viele Möglichkeiten zum Schreiben und Hinzufügen von Code. Ach so viele verschiedene Sprachen und Sprachversionen auch. Es ist meistens eine Frage der Erfahrung. Ab Level 5 wird es leichter, ab Level 10 ist es nur noch ein Ärgernis. :)

Sie müssen jede .m-Datei, die Box2D enthält entweder direkt (#import "Box2D.h") oder indirekt (einschließlich einer Kopfzeile, die Box2D enthält) umbenennen. Wenn Sie der Prefix.pch-Datei den Box2D-Header hinzufügen, wäre das der gleiche wie in jeder Datei - also würde ich das in Ihrer Situation nicht tun.

Sie können die Umbenennung vermeiden, indem Sie den Dateityp der .m-Dateien in Xcode auf "Objective-C++" festlegen. Obwohl das genauso mühsam sein wird, wenn nicht mehr. Tipp: Es gibt gute Tools für Massenumbenennungen, genau für solche Situationen.

+0

Vielen Dank für den Versuch zu helfen. Ich werde meinen aktuellen Versuch dazu in einer Bearbeitung meiner ursprünglichen Frage erläutern, da ich immer noch den gleichen Fehler erhalte. – soleil

+0

Ich habe die Änderungen oben gemacht. Können Sie auch näher erläutern, wie ich überprüfen kann, ob der Suchpfad richtig ist? Ich habe diesen Teil deiner Antwort nicht verstanden. Vielen Dank! – soleil

+0

Minus eine Ebene, da Box2D bereits den Box2D-Ordner im Suchpfad enthält, hat es endlich für mich funktioniert! Vergessen Sie nicht, den Suchpfad zwischen "" zu setzen, als ob Box2D in Ihrem Projektordner "$ (SRCROOT)" wäre. –

2

Fügen Sie diese auf den Header-Suchpfade und sehen Sie die magische Arbeit: $ [project_dir]

0

Sie können folgende Kompilierungsfehlern haben:

  1. „Header-Dateien nicht gefunden“: Lösung ist Ändern Sie den Suchpfad des Benutzerheaders, um das Verzeichnis von Box2D einzuschließen. Wenn Sie Box2D unterhalb Ihres Projektverzeichnisses platzieren, können Sie die folgende Umgebungsvariable $ {PROJECT_DIR} verwenden. Denken Sie daran, "rekursiv" zu überprüfen. HINWEIS: Entfernen Sie den gesamten Link zu Box2D aus dem Headerpfad. Zum Beispiel: TestGame/Bibliotheken/Box2D -> $ {project_dir}/TestGame/Bibliotheken

  2. Cpp-Header-Dateien nicht wie <cassert> ...: benennen Sie die Datei auf der Endung * .mm statt * .m wird Löse dieses Problem.