web-dev-qa-db-ger.com

Wie kann man g ++ nach Header-Dateien in einem bestimmten Verzeichnis suchen?

Ich habe ein Projekt (eine Bibliothek), das in einige Verzeichnisse mit Code unterteilt ist. Ich möchte, dass g ++ nach Headerdateien im Stammverzeichnis des Projekts sucht, sodass ich unterschiedliche Include-Pfade für dieselben Headerdateien in mehreren Quelldateien vermeiden kann.

Das root/-Verzeichnis hat hauptsächlich Unterverzeichnisse A/, B/ und C/, die alle .hpp- und .cpp-Dateien enthalten. Wenn eine Quelldatei in A file.hpp enthalten wollte, die sich in B befand, müsste dies folgendermaßen geschehen: #include "../B/file.hpp". Dasselbe gilt für eine andere Quelldatei, die sich in C befand. Wenn A jedoch selbst Unterverzeichnisse mit Dateien hatte, die file.hpp benötigten, wäre dies inkonsistent und würde zu Fehlern führen, wenn ich beschloss, Dateien zu verschieben (da der Include-Pfad "../../B/file.hpp" wäre). .

Dies müsste auch von anderen Projekten aus funktionieren, die sich außerhalb von root/ befinden. Ich weiß bereits, dass es eine Option gibt, alle meine Header-Dateien manuell in ein Standard-Suchverzeichnis zu kopieren, aber ich möchte dies auf die beschriebene Weise machen.

Edit: Alle Programme, die die Bibliothek verwenden, dürfen nur mit g++ prog.cpp lib.a -o prog kompiliert werden. Das heißt, permanent setzt den Include-Pfad für g ++!

31
corazza

A/code.cpp

#include <B/file.hpp>

A/a/code2.cpp

#include <B/file.hpp>

Kompilieren mit:

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

Bearbeiten:

Sie können Umgebungsvariablen verwenden, um den Pfad zu ändern, den g ++ für Header-Dateien sucht. Von der Manpage:

Einige zusätzliche Umgebungsvariablen beeinflussen das Verhalten von Präprozessor.

   CPATH
   C_INCLUDE_PATH
   CPLUS_INCLUDE_PATH
   OBJC_INCLUDE_PATH

Der Wert jeder Variablen ist eine Liste von Verzeichnissen, die durch ein Sonderzeichen getrennt sind, ähnlich wie PATH, in dem nach Header .__ gesucht werden soll. Dateien. Das Sonderzeichen "PATH_SEPARATOR" ist zielabhängig und wird zum Zeitpunkt der GCC-Erstellung festgelegt. Für Microsoft Windows-basierte Ziele ist es ist ein Semikolon und für fast alle anderen Ziele ein Doppelpunkt.

CPATH gibt eine Liste von Verzeichnissen an, die durchsucht werden sollen, als wäre sie mit -I angegeben, jedoch nach allen Pfaden, die mit -I-Optionen in der .__ angegeben wurden. Befehlszeile. Diese Die Umgebungsvariable wird verwendet, unabhängig davon, welche Sprache vorverarbeitet wird.

Die übrigen Umgebungsvariablen gelten nur für die Vorverarbeitung der angegebenen Sprache. Jedes gibt ein .__ an. Liste der zu bezeichnenden Verzeichnisse gesucht, als ob mit -isystem angegeben, jedoch nach allen Pfaden, die mit -isystem-Optionen in der Befehlszeile angegeben wurden.

In all diesen Variablen weist ein leeres Element den Compiler an, sein aktuelles Arbeitsverzeichnis zu durchsuchen. Leere Elemente können erscheinen am Anfang oder Ende eines Pfades. Wenn der Wert von CPATH beispielsweise ":/special/include" lautet, hat dies die gleiche Wirkung wie -I . -I/special/enthalten.

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

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

Sie können dies natürlich in Ihrem Makefile usw. hinzufügen.

42
Vikas
gcc -I/path -L/path
  • -I /path Pfad zum Einschließen, gcc findet die .h-Dateien in diesem Pfad

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

16
Yueyoum

es ist ganz einfach: Verwenden Sie die Option "-B", um das Verzeichnis der .h-Dateien zum Suchpfad hinzuzufügen. 

Z.B. g ++ -B /header_file.h Ihre.cpp -o bin/Ihr_Befehl

0
Zhile Zou

In #include <> enthaltene Header werden in allen Standardverzeichnissen durchsucht. Sie können jedoch auch einen eigenen Speicherort im Suchpfad mit dem Befehlszeilenargument -I angeben.

Ich habe gesehen, wie Sie Ihre Bearbeitung normalerweise an Standardpositionen installiert haben 

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

Bestätigen Sie jedoch mit Compiler-Dokumenten.

0
NiladriBose