2010-10-15 6 views
7

Ich habe in der Vergangenheit Probleme bekommen, wenn ich versucht habe, C++ - Code, der auf Mac OS X geschrieben wurde, auf ein Linux-System zu portieren oder Code gegen eine ältere Version von gcc/g ++ mit einem neueren zu kompilieren:Wie kann ich kontrollieren, wie gcc/g ++ automatisch Header enthält?

Es scheint, dass einige (ältere?) Versionen von gcc/g ++ automatisch einige Header-Dateien für Sie enthalten würden.

Zum Beispiel sollte Code, der printf verwendet, #include <stdio.h> erfordern. Und Code, der memcpy verwendet, sollte #include <string.h> erfordern. Aber abhängig von der Version von GCC, die ich verwende, wird es gelegentlich für mich enthalten.

Es verheerend, wenn ich vergesse, etwas einzubinden und dann bekomme nie Fehler bis ich gehe, um den Code auf einem anderen System zu kompilieren. An diesem Punkt ist es ein Spiel, das über das ganze Projekt läuft und die Includes festlegt.

Hat jemand anderes in das hineingeraten? Gibt es eine Möglichkeit, gcc zum automatischen oder automatischen Ausschluss zu zwingen? Oder gibt es eine Möglichkeit zu wissen, was es ist autoincluding?

+0

Kann sein, wenn gcc funktioniert es automatisch wäre es zu subtil geworden für sie dieselben Methoden Namen in verschiedenen Bibliotheken zu verstehen. Aber wenn es eine automatische Lösung gibt, würde ich es gerne wissen. –

+3

Sind Sie sicher, dass es nicht andere Header sind, die diese einbeziehen, und auf den anderen Plattformen nicht? –

+1

gcc nicht "automatisch einbeziehen" - Sie erhalten wahrscheinlich nur indirekte Includes über Header, die Sie explizit eingeschlossen haben, wie oben von Preet vorgeschlagen. Fazit: Sie müssen Ihren Code reparieren. –

Antwort

2

Sind Sie sicher, dass es nicht andere Header ist, die diese einholen, und auf den anderen Plattformen nicht?

0

Wenn Sie auf verschiedenen Systemen kompilieren, treffen Sie möglicherweise verschiedene Probleme und schließen nicht nur ein. Ich würde vorschlagen, in ein Continuous-Build-System zu investieren, das nach jeder Aktualisierung des Codes auf allen Betriebssystemen kompiliert, die Sie benötigen, so dass Sie sich schnell eines Portabilitätsproblems bewusst sind.

Sie können auch alle gängigen System-Header-Dateien in eine bestimmte Header-Datei schreiben, die Sie schreiben und systematisch in alle Ihre Dateien einfügen.

+0

Dies ist ein guter Vorschlag , aber in einem Fall war es eine Drittanbieter-Bibliothek (eine alte Version von OpenSceneGraph) und etwas alter Code, der beim Upgrade auf eine neuere Version von gcc kaputtging. Auto-Kompilierung für mehrere Betriebssysteme hätte hier nicht geholfen, und ich vermute, dass das Problem vielleicht nur darin bestand, dass # innerhalb des Systems enthalten ist. Include-Dateien wurden zwischen gcc-Releases reorganisiert: / – Dave

5

-include-Datei Datei so verarbeiten, als ob #include "file" als erste Zeile der primären Quelldatei angezeigt wird. Das erste Verzeichnis, in dem nach Dateien gesucht wird, ist jedoch das Arbeitsverzeichnis des Präprozessors und nicht das Verzeichnis, das die Hauptquelldatei enthält. Wenn dort nicht gefunden wird, wird im Rest der #include "..." Suchkette wie normal gesucht. Wenn mehrere-include-Optionen angegeben sind, werden die Dateien in der Reihenfolge angezeigt, in der sie in der Befehlszeile angezeigt werden.

http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html

Verwandte Themen