2012-09-29 3 views
26

Ich habe ein Projekt (eine Bibliothek), die in ein paar Verzeichnisse mit Code unterteilt ist. Ich würde gerne g ++ suchen nach Header-Dateien im Stammverzeichnis des Projekts, so dass ich verschiedene Include-Pfade für die gleichen Header-Dateien über mehrere Quelldateien vermeiden kann.Wie mache ich g ++ Suche nach Header-Dateien in einem bestimmten Verzeichnis?

Vor allem das root/ Verzeichnis hat Unterverzeichnisse A/, B/ und C/, von denen alle innerhalb .hpp und .cpp Dateien. Wenn irgendeine Quelldatei in A file.hpp enthalten wollte, was in B war, würde es so aussehen: #include "../B/file.hpp". Gleiches gilt für eine andere Quelldatei in C. Aber wenn A selbst Unterverzeichnisse mit Dateien hatte, die file.hpp benötigten, wäre es inkonsistent und würde Fehler verursachen, wenn ich mich dazu entschließen würde, Dateien zu verschieben (weil der Include-Pfad "../../B/file.hpp" wäre). .

Auch dies müsste von anderen Projekten auch funktionieren, die außerhalb von root/ liegen. Ich weiß bereits, dass es eine Option gibt, alle meine Header-Dateien manuell in ein Standardsuchverzeichnis zu kopieren, aber ich würde das gerne so machen, wie ich es beschrieben habe.

Bearbeiten: Alle Programme mit der Bibliothek müssen nur mit g++ prog.cpp lib.a -o prog kompilieren. Das bedeutet dauerhaft Einstellung der Include-Pfad für g ++!

Antwort

35

A/code.cpp

#include <B/file.hpp> 

A/a/code2.cpp

#include <B/file.hpp> 

Compile mit:

g++ -I /your/source/root /your/source/root/A/code.cpp 
g++ -I /your/source/root /your/source/root/A/a/code2.cpp 

Edit:

Sie Umgebung verwenden können Variablen zum Ändern des Pfades g ++ sucht nach Kopf er Dateien. Von der Manpage:

Einige zusätzliche Umgebungsvariablen beeinflussen das Verhalten des Präprozessors .

CPATH 
    C_INCLUDE_PATH 
    CPLUS_INCLUDE_PATH 
    OBJC_INCLUDE_PATH 

jeden Wert der Variablen ist eine Liste der Verzeichnisse, die von einem Sonderzeichen getrennt, ähnlich wie PATH, in denen für Kopf Dateien zu suchen. Das Sonderzeichen "PATH_SEPARATOR" ist zielabhängig und wird zur GCC-Build-Zeit festgelegt. Für Microsoft Windows-basierte Ziele ist es ein Semikolon, und für fast alle anderen Ziele ist es ein Doppelpunkt.

CPATH gibt eine Liste der zu durchsuchenden Verzeichnisse an, die mit -I angegeben wurden, aber nach allen Pfaden, die mit den Optionen -I auf der Befehlszeile angegeben wurden. Diese Umgebungsvariable wird unabhängig davon verwendet, welche Sprache vorverarbeitet wird.

Die restlichen Umgebungsvariablen gelten nur für die Vorverarbeitung der angegebenen Sprache. Jeder gibt eine Liste von Verzeichnissen an, die sein sollen, als ob sie mit -isystem spezifiziert wären, aber nach irgendwelchen Pfaden, die mit -isystem Optionen auf der Kommandozeile angegeben wurden.

In allen diesen Variablen weist ein leeres Element den Compiler an, das aktuelle Arbeitsverzeichnis zu durchsuchen. Leere Elemente können am Anfang oder Ende eines Pfades erscheinen. Wenn der Wert von CPATH beispielsweise ":/special/include" ist, hat dies den gleichen Effekt wie -I. -I/Spezial/enthalten.

Es gibt viele Möglichkeiten, wie Sie eine Umgebungsvariable ändern können. Auf bash auffordern, dies zu tun:

$ export CPATH=/your/source/root 
$ g++ /your/source/root/A/code.cpp 
$ g++ /your/source/root/A/a/code2.cpp 

Sie können natürlich dieses Add in Ihrem Makefile usw.

+0

Hey, ich habe die Frage ohne ein wichtiges Detail, siehe die Bearbeitung, danke! – corazza

+0

@Bane, das ändert alles :-). Ich habe meine Antwort so bearbeitet, dass sie mehr Optionen enthält, die verwendet werden können. – Vikas

+0

Das scheint das zu sein, wonach ich suche. Wie genau kann ich diese bearbeiten? (Mit einer CLI-Anweisung, die ich der Installationsregel meiner Bibliothek hinzufügen muss.) – corazza

0

Header mit #include < enthalten> werden in allen Standardverzeichnisse durchsucht werden, aber Sie können auch hinzufügen Ihr eigener Ort im Suchpfad mit -I Befehlszeile arg.

Ich sah Ihre bearbeiten Sie Ihre Header in Standardpositionen in der Regel allerdings

/usr/local/include 
libdir/gcc/target/version/include 
/usr/target/include 
/usr/include 

Bestätigen Sie mit Compiler-Dokumentation installieren könnte.

+0

Ja, ich weiß, aber bitte sehen Sie den Schnitt. – corazza

+0

Ya siehe oben enthält die Installation in Standardspeicherorten für eine schnelle Lösung. – NiladriBose

12
gcc -I/path -L/path 
  • -I /path Pfad zu schließen, wird gcc-Dateien in diesem Pfad finden .h

  • -L /path Bibliotheksdateien enthält, .a, .s o

0

es ist einfach, verwenden Sie die "-B" -Option zum Hinzufügen von .h Dateien Verzeichnis zum Suchpfad.

z. g ++ -B /header_file.h your.cpp -o bin/your_command

Verwandte Themen