2012-09-29 30 views
26

Tengo un proyecto (una biblioteca) que se subdivide en unos pocos directorios con código en ellos. Me gustaría tener g ++ búsqueda de archivos de encabezado en el directorio raíz del proyecto, por lo que puedo evitar diferentes rutas de inclusión para los mismos archivos de encabezado en múltiples archivos de origen.¿Cómo hacer que g ++ busque archivos de encabezado en un directorio específico?

Principalmente, el directorio root/ tiene subdirectorios A/, B/ y C/, todos los cuales tienen .hpp y .cpp archivos dentro. Si algún archivo fuente en A desea incluir file.hpp, que estaba en B, tendría que hacerlo así: #include "../B/file.hpp". Lo mismo para otro archivo fuente que estaba en C. Pero, si A tuviera subdirectorios con archivos que necesitaran file.hpp, entonces sería inconsistente y causaría errores si decidiera mover archivos (porque la ruta de inclusión sería "../../B/file.hpp") .

Además, esto también debería funcionar desde otros proyectos, que residen fuera de root/. Ya sé que hay una opción para copiar manualmente todos mis archivos de encabezado en un directorio de búsqueda predeterminado, pero me gustaría hacer esto de la manera que describí.

Edición: todos los programas que utilizan la biblioteca deben compilar solo con g++ prog.cpp lib.a -o prog. Eso significa permanentemente estableciendo la ruta de inclusión para g ++!

Respuesta

35

A/code.cpp

#include <B/file.hpp> 

A/a/code2.cpp

#include <B/file.hpp> 

Compilar usando:

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

Editar:

Usted puede utilizar el ambiente variables para cambiar la ruta g ++ busca cabeza er archivos. Desde la página del manual:

Algunas variables de entornos adicionales afectan el comportamiento del preprocesador .

CPATH 
    C_INCLUDE_PATH 
    CPLUS_INCLUDE_PATH 
    OBJC_INCLUDE_PATH 

valor de cada variable es una lista de directorios separados por un carácter especial, al igual que PATH, en el que se buscará cabecera archivos. El carácter especial, "PATH_SEPARATOR", depende del objetivo y se determina en el tiempo de compilación de GCC. Para objetivos basados ​​en Microsoft Windows, es un punto y coma, y ​​para casi todos los demás objetivos es un punto y coma.

CPATH especifica una lista de directorios que se buscarán como si se especifica con -I, pero después de cualquier ruta dada con -I opciones en la línea de comando . Esta variable de entorno se usa independientemente del idioma que se está preprocesando.

Las variables de entorno restantes se aplican solo al preprocesar el idioma particular indicado. Cada uno especifica una lista de directorios a ser buscada como si estuviera especificada con -isystem, pero después de cualquier ruta dada con -isystem options en la línea de comando.

En todas estas variables, un elemento vacío indica al compilador que busque su directorio de trabajo actual. Los elementos vacíos pueden aparecer al principio o al final de una ruta. Por ejemplo, si el valor de CPATH es ":/special/include", tiene el mismo efecto que -I. -I/special/include.

Existen muchas maneras de cambiar una variable de entorno. En bash se puede hacer esto:

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

Por supuesto, puede añadir este en su Makefile etc.

+0

Oye, he planteado la pregunta sin un detalle importante, por favor mira la edición, ¡gracias! – corazza

+0

@Bane, eso cambia todo :-). Edité mi respuesta para incluir más opciones que se pueden usar. – Vikas

+0

Eso parece ser lo que estoy buscando. ¿Cómo exactamente puedo editarlos? (Con una instrucción CLI, es decir, que debo agregar a la regla de instalación de mi archivo MAKE). – corazza

0

encabezados se incluyen con # include <> se buscará en todos los directorios por defecto, pero también se puede añadir su propia ubicación en la ruta de búsqueda con -I command line arg.

vi tu edición se podría instalar sus cabeceras en ubicaciones predeterminadas por lo general

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

Confirmar con la documentación del compilador sin embargo.

+0

Sí, lo sé, pero consulte la edición. – corazza

+0

Ya ve arriba la instalación incluye ubicaciones predeterminadas para una resolución rápida. – NiladriBose

12
gcc -I/path -L/path 
  • -I /path ruta para incluir, gcc encontrará .h archivos en este camino

  • -L /path contiene archivos de la biblioteca, .a, .s o

0

es simple, utilice el Opción "-B" para agregar el directorio .h files a la ruta de búsqueda.

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

Cuestiones relacionadas