2 Stimmen

Frage zur Reihenfolge der Include-Verzeichnisse in g++

Irgendwie ist dies das erste Mal, dass ich in vielen Jahren der Programmierung auf dieses Problem gestoßen bin, und ich bin mir nicht sicher, welche Möglichkeiten es gibt, es zu lösen.

Ich bin dabei, eine Anwendung auf Linux zu portieren, und es gibt eine Header-Datei in einem der Verzeichnisse, die anscheinend den gleichen Namen wie eine Header-Datei in der Standard-C-Bibliothek hat, und wenn "cstdlib" von einer anderen Datei in diesem Verzeichnis eingeschlossen wird, versucht es, die lokale Datei einzuschließen, anstatt die richtige aus der Standardbibliothek.

Insbesondere heißt die Datei "endian.h", die versucht, von /usr/include/bits/waitstatus.h aus eingebunden zu werden. Anstatt /usr/include/bits/endian.h einzubinden, wird also versucht, ./endian.h einzubinden.

Ist meine einzige Option, die endian.h im Projekt in etwas anderes umzubenennen, oder gibt es eine Möglichkeit, die ich erzwingen kann, den Compiler in das gleiche Verzeichnis wie die Datei zu suchen, die es von zuerst einbezogen wird?


Editar:

Okay, das war nur ein dummer Fehler meinerseits. Mein Makefile war auf -I. gesetzt, also hat es zuerst im aktuellen Verzeichnis gesucht. D'oh.

7voto

Michael Aaron Safyan Punkte 90663

Es gibt einen wichtigen Unterschied zwischen:

#include "endian.h" // Look in current directory first.

Und

#include <endian.h> // Look in the standard search paths.

Wenn Sie die Datei im aktuellen Verzeichnis haben wollen, verwenden Sie die Anführungszeichen. Wenn Sie das Systemverzeichnis wollen, verwenden Sie die spitzen Klammern. Beachten Sie, dass, wenn Sie das aktuelle Verzeichnis mit dem "-I"-Flag in den Include-Pfad aufgenommen haben, beide auf das aktuelle Verzeichnis aufgelöst werden könnten, in diesem Fall sollten Sie "-I" nicht mit dem aktuellen Verzeichnis verwenden.

1voto

David Cournapeau Punkte 74679

Wenn Sie die Datei mit "" anstelle von <> einbinden, sollte der Header zuerst in demselben Verzeichnis wie die Datei, die ihn einschließt, gesucht werden.

Wenn möglich, ist es jedoch besser, die Datei umzubenennen: So werden Probleme vermieden, wenn Dateien verschoben werden, wenn Sie Ihr Build-System ändern usw.. Das "" vs. <> ist auch compilerabhängig (es ist NICHT vom C-Standard vorgeschrieben, sich so zu verhalten, wie g++ es tut).

1voto

Vielleicht können Sie sich die Optionen "-I" und "-I-" ansehen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X