2010-06-26 7 views
8

Ich habe ein Projekt, das in Ordnung innerhalb g wurde Kompilieren ++ (ich kann die Version jetzt nicht sehen) und jetzt auf xCode ist es nicht.
Ich denke, dass ich das Problem jetzt habe ... Ich habe eine String.h Datei in meinem Projekt, und es scheint tha der xCode Compiler (dh gcc) versucht, meine eigene String-Datei aus dem < cstring> hinzuzufügen .. . ich bin nicht sicher, aber einen Blick auf diesem Bild machen
http://www.jode.com.br/Joe/xCode1.png<string.h> in Konflikt mit meinem eigenen String.h

aus, wie es aussieht, ist es meine eigenen anstelle der Systemdatei einschließlich, ich frage mich ... sollte nicht # include < Datei> ein System enthalten sein? wegen der <>? und sollte das System nicht eine Datei in seinem eigenen Pfad und nicht den ursprünglichen Pfad meiner Anwendung enthalten?
Wie gesagt, ich bin mir nicht sicher, ob das passiert, weil ich gerade in den letzten 2 Tagen nach osx migriere ...
Ich wollte meinen Klassen- und Dateinamen ändern, um Konflikte zu vermeiden, also würde es funktionieren, wenn das wirklich das Problem ist, aber ich frage mich, soll es eine andere Möglichkeit, dies zu tun, denn jetzt mein Projekt nicht so groß ist, so kann ich dies in einiger Zeit tun, aber was, wenn das Projekt war größer? es wäre dificult alle umfasst und Klassennamen ... ist

Jede Hilfe

Danke,

Antwort

4

Benennen Header mit dem gleichen Namen wie Standard-Header wie String.h und einschließlich sie einfach mit #include <String.h> fragt nach Ärger (der Unterschied im Gehäuse macht keinen Unterschied auf einigen Plattformen).

Wie Sie gesagt haben, es wäre jedoch schwierig zu versuchen, herauszufinden, was diese im Voraus sind, wenn Sie Ihre Header nennen. Somit ist der einfachste Weg, dies zu tun ist, gesetzt außerhalb eines Unterverzeichnis Ihrer Include-Pfad eine Verzeichnisebene zu setzen, in dem Ihre Header befinden, ex:

#include <Jonathan/String.h> 

Jetzt müssen Sie nicht darum kümmern, ob Der Name der String.h-Datei steht in Konflikt mit einer der Bibliotheken, die Sie verwenden, es sei denn, sie enthalten auch <Jonathan/String.h>, was unwahrscheinlich ist. Alle anständigen Bibliotheken von Drittanbietern tun dies auch. Wir nehmen <function.hpp> nicht in Boost, sondern stattdessen <boost/function.hpp>. Das Gleiche gilt für GL/GL.h anstelle von einfach GL.h. Diese Praxis vermeidet Konflikte zum größten Teil und Sie müssen Probleme nicht umgehen, indem Sie String.h in etwas wie Text.h umbenennen.

+0

mein Problem war, dass der Cstring wurde meine String.h anstelle von te String.h des Systems, wird dies, was Sie gesagt haben, dies zu lösen? – Jonathan

+0

Ja, wenn Sie Ihren String.h-Header in ein Jonathan-Unterverzeichnis stellen, kann diesen nicht einschließen, da angegeben werden muss. – stinky472

+2

Wenn Sie nicht Jonathan heißen, passen Sie diese Antwort natürlich an. –

1

Auf OSX geschätzt zu ändern
Jonathan das Dateisystem ist Groß- und Kleinschreibung - so String.h können Sie winden mit solchen Konflikten. == String.h string.h

+0

Ich nehme es Groß- und Kleinschreibung auch mit g ++ war ... – Wizard79

+1

Oh, ich dachte, du wir das Projekt von Linux migrieren. Es hat schon mal an osx gearbeitet? – Jubal

+0

Hmm eigentlich ist in der Frage das Quell-OS nicht angegeben, also könntest du recht haben! – Wizard79

4

Ja, wenn Sie

#include "file" 

das lokale Verzeichnis nachgeschlagen erste und

#include <file> 

nur das System umfassen Ordner betreut werden.

Beachten Sie das Wort zuerst nur im ersten Fall. Das bedeutet, dass jedes Mal, die lokale Version enthalten ist, sollte nie (, wenn Sie Ihren Quellpfad in der Include-Anweisung enthalten sind,) zu erreichen.

sagte, dass mein Dummy-Vorschlag ist Ihre lokale Datei mit einem eindeutigen Namen umbenennen ...

1

es funktionierte durch den Namen von String.h Ändern

aber das macht keinen Sinn, Text.h , da die std-library ihre eigene string.h enthält und nicht meine.
Ich meine, macht keinen Sinn, ein Entwickler seine Dateien zu erstellen, zu denken, welche Namen er nicht verwenden können, für eine Instanz, können sagen, dass ich meine Text.h String.h ändern (habe ich schon, ich muss arbeiten und das lässt mich nicht) ad irgendwie musste ich eine andere Bibliothek mit Vorlagen einschließen, die ein Include namens Text.h hat, müsste ich meinen text.h erneut ändern oder diese neue Bibliothek nicht benutzen? es sollte eine Alternative geben.
Oder sollte es nicht?

Dank für die Hilfe bisher
Jonathan

+0

Nun, es gibt keine mögliche Lösung. Wenn dem System zwei Dateien mit demselben Namen bekannt sind, muss es * eine * davon auswählen. Wenn Ihre Datei der Standardbibliothek vorgezogen wird, besteht die Gefahr, dass Sie viel Code von Drittanbietern einbüßen. Stellen Sie sich einen anderen Header der Standardbibliothek vor, der versucht, string.h einzuschließen. Nun, mit Ihrer Regel, enthält es * Ihre * string.h anstelle der Standard-Bibliothek. Und dann kompiliert die Standardbibliothek nicht mehr. Die Standardbibliothek definiert einen festen Satz von Headern, und es liegt an Ihnen, Konflikte mit diesen zu vermeiden. – jalf

+0

Sie können 'include" file "' anstelle von '' verwenden, damit der Compiler zuerst lokale Ordner durchsucht, was normalerweise dazu führt, dass Ihre Header Vorrang vor denen des Systems haben. Sie könnten auch den Include-Pfad des Compilers ändern. – jalf

0

Zwei Dinge, die Sie laufen in:

  1. Wie oben erwähnt, ist das Dateisystem auf Mac OS Groß- und Kleinschreibung, wenn Sie speziell Ihr Dateisystem sein case-sensitive einzurichten.
  2. gcc unterscheidet nicht allzu sehr zwischen lokalen und System-Header-Include-Pfaden. Wenn Sie ein Verzeichnis angeben, das über -I zum Pfad hinzugefügt werden soll, wird dieses Verzeichnis verwendet, um sowohl lokale als auch Systemeinschlüsse zu finden. Nur wenn Sie -iquote oder -I- verwenden, wird ein Verzeichnis für die Suche nach Systemeinzelposten übersprungen. Außerdem werden die eingebauten "system include" -Verzeichnisse im Suchpfad des Compilers immer gesucht, um nach lokalen Includes zu suchen.
    • Beachten Sie, dass das aktuelle Verzeichnis für lokale, aber nicht für systemeigene Includes verwendet wird. In diesem Fall glaube ich, dass String.h aufgerufen wird, weil die Projekteinstellungen dem Include-Pfad explizit das Projektverzeichnis der obersten Ebene hinzufügen.

Die Abhilfe, die ich vorschlagen würde, anstatt das Umbenennen Ihrer enthält, ist Ihre Dienstprogramme in ein Verzeichnis, dessen Name für Ihr Projekt ist einzigartig zu setzen, und das Verzeichnis angeben, in der Richtlinie enthalten. Zum Beispiel:

#include "Josk/String.h" 

und stellen Sie sicher, Josk/ selbst ist nicht in Ihrem Include-Suchpfad. Auf diese Weise bleiben Sie nicht beim umständlichen Umbenennen hängen, obwohl Sie möglicherweise einige Dateien in Ihrem Projekt mischen müssen. Sie müssen möglicherweise auch Ihre Projekteinstellungen bearbeiten, um sicherzustellen, dass das übergeordnete Verzeichnis dieses Dienstprogrammverzeichnisses in Ihrem Include-Pfad enthalten ist.

Eine andere Möglichkeit zu versuchen ist, wenn Sie das Projektverzeichnis der obersten Ebene, das dem Include-Pfad Ihres Projekts hinzugefügt wurde, entfernen. Dadurch sollten Elemente in Ihrem Top-Level-Projektverzeichnis nicht nach System-Includes durchsucht werden.

Schließlich können Sie dieses Problem in diesem speziellen Fall auch vermeiden, indem Sie die Groß- und Kleinschreibung Ihres Dateisystems ändern. Dies kann jedoch einige Mac-Anwendungen kaputt machen, also recherchieren Sie das Problem, bevor Sie damit beginnen - oder wählen Sie ein Volume, das sonst nicht verwendet wird.

8

Ich hatte das gleiche Problem und es war schwer zu lösen. brauchte meine Stunden um zu reparieren. Das Problem ist die Headerkarte von xcode.und die Lösung - außer diese Art von reservierten Namen zu vermeiden, was eine gute Idee im Allgemeinen, aber nicht immer möglich, mit Drittanbieter-Libs - ist

USE_HEADERMAP = NO 

auf Ihre benutzerdefinierten Einstellungen hinzuzufügen.

ein dickes Lob an diesen Jungs: http://meidell.dk/archives/2010/05/08/xcode-header-map-files/ http://www.cocoabuilder.com/archive/xcode/262586-header-file-problem-sorry-to-bug-this-list.html

+0

Danke dafür. Module können nicht früh genug kommen. –

+1

Dies sollte die akzeptierte Antwort sein. Vielen Dank! –