web-dev-qa-db-fra.com

Comment faire en sorte que g ++ recherche les fichiers d'en-tête dans un répertoire spécifique?

J'ai un projet (une bibliothèque) qui est subdivisé en quelques répertoires contenant du code. J'aimerais que g ++ recherche les fichiers d'en-tête dans le répertoire racine du projet afin d'éviter des chemins d'inclusion différents pour les mêmes fichiers d'en-tête sur plusieurs fichiers sources.

Le répertoire root/ contient principalement les sous-répertoires A/, B/ et C/, qui contiennent tous des fichiers .hpp et .cpp. Si un fichier source de A voulait inclure file.hpp, qui était en B, il devrait le faire comme ceci: #include "../B/file.hpp". Pareil pour un autre fichier source qui était en C. Mais, si A avait lui-même des sous-répertoires avec les fichiers qui avaient besoin de file.hpp, alors, cela serait incohérent et causerait des erreurs si je décidais de déplacer des fichiers (car le chemin d’inclusion serait "../../B/file.hpp") .

En outre, cela devrait également fonctionner avec d’autres projets, situés en dehors de root/. Je sais déjà qu'il existe une option pour copier manuellement tous mes fichiers d'en-tête dans un répertoire de recherche par défaut, mais j'aimerais procéder comme je l'ai décrit.

Edit: tous les programmes utilisant la bibliothèque doivent être compilés uniquement avec g++ prog.cpp lib.a -o prog. Cela signifie que de manière permanente définit le chemin d’inclusion pour g ++!

31
corazza

A/code.cpp

#include <B/file.hpp>

A/a/code2.cpp

#include <B/file.hpp>

Compiler en utilisant:

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

Modifier:

Vous pouvez utiliser des variables d'environnement pour modifier le chemin d'accès recherché par g ++ pour les fichiers d'en-tête. De la page de manuel:

Certaines variables d'environnement supplémentaires affectent le comportement du fichier pré-processeur.

   CPATH
   C_INCLUDE_PATH
   CPLUS_INCLUDE_PATH
   OBJC_INCLUDE_PATH

La valeur de chaque variable est une liste de répertoires séparés par un caractère spécial, un peu comme PATH, dans lesquels rechercher l'en-tête des dossiers. Le caractère spécial "PATH_SEPARATOR" dépend de la cible et est déterminé lors de la compilation de GCC. Pour les cibles Microsoft Windows, il est un point-virgule, et pour presque toutes les autres cibles, il s'agit d'un colon.

CPATH spécifie une liste de répertoires à rechercher, comme spécifié avec -I, mais après tous les chemins donnés avec les options -I sur le fichier ligne de commande. Ce La variable d'environnement est utilisée quelle que soit la langue en cours de prétraitement.

Les variables d'environnement restantes s'appliquent uniquement lors du prétraitement de la langue indiquée. Chacun spécifie un liste des répertoires à être recherché comme si spécifié avec -isystem, mais après tous les chemins donnés avec les options -isystem sur la ligne de commande.

Dans toutes ces variables, un élément vide indique au compilateur de rechercher son répertoire de travail actuel. Les éléments vides peuvent apparaissent au début ou fin d'un chemin. Par exemple, si la valeur de CPATH est ":/special/include", cela aura le même effet que -I . -I/spécial/inclure.

Il existe de nombreuses façons de modifier une variable d’environnement. Sur l'invite de bash vous pouvez faire ceci:

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

Vous pouvez bien sûr ajouter ceci dans votre Makefile, etc.

42
Vikas
gcc -I/path -L/path
  • -I /path chemin à inclure, gcc trouvera les fichiers .h dans ce chemin

  • -L /path contient les fichiers de bibliothèque, .a, .so

16
Yueyoum

c'est simple, utilisez l'option "-B" pour ajouter le répertoire des fichiers .h au chemin de recherche. 

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

0
Zhile Zou

Les en-têtes inclus avec #include <> seront recherchés dans tous les répertoires par défaut, mais vous pouvez également ajouter votre propre emplacement dans le chemin de recherche avec -I, ligne de commande arg.

J'ai vu votre modification, vous pouvez installer vos en-têtes dans des emplacements par défaut généralement 

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

Confirmez avec les documents du compilateur.

0
NiladriBose