2012-01-08 11 views
6

Tengo el siguiente stucture direcory:inclusión de archivos de encabezado - relativo al directorio actual o para incluir directorios?

src 
    +-- lib1 
    +-- lib1.h 
    +-- lib2 
    +-- lib2.h 

Tanto lib1 y lib2 van a ser distribuidos (instalado). lib2 hace uso de lib1, por lo que necesita un poco incluye:

#include "../lib1/lib1.h" // 1 
#include "lib1/lib1.h" // 2 
#include <lib1/lib1.h> // 3 

(1) es el camino a seguir recto, pero es muy inflexible. (2) es la forma en que uso en este momento, pero el sistema de compilación necesita saber que se debe agregar src a la ruta de inclusión. (3) parece el mejor para mí en el aspecto de distribución porque entonces se puede suponer que los encabezados residen en una ubicación estándar, pero no es demasiado obvio para mí cómo maneja eso un sistema de compilación (en este caso, lib1 necesita ser instalado antes de lib2 se puede compilar).

¿Cuál es la manera recomendada?

+0

¿Qué quiere decir con "instalar" una lib? ¿Es esto una biblioteca estática o dinámica? Si es estático, simplemente cree una buena estructura de depósito y agregue estas carpetas a su ruta de inclusión. –

+0

Esto es todo específico de implementación. ¡Algunos sistemas ni siquiera tienen directorios! –

+0

@EdS., Quiero decir: los archivos de encabezado y libs se copian en algún lugar (ubicación estándar, '/ usr/local/{lib, include}') para que sea posible usarlos en otros proyectos. –

Respuesta

9

La única diferencia entre "" y <> formas de incluir es que el "" formas primera búsqueda en algunos lugares y luego vuelve a los mismos lugares que los <>. El conjunto de lugares adicionales depende de la implementación y el único común es el directorio del archivo que contiene la directiva include. Las opciones del compilador que se agregan a la ruta include generalmente se agregan para el formulario <>, por lo que se busca en ambos directorios.

Así que la elección entre las dos formas es principalmente una de estilo. El uso del formulario "" para el proyecto actual y el <> es común para las bibliotecas del sistema. Para las cosas intermedias, toma una decisión y mantenla en tu proyecto.

+0

Desde el punto de 'lib2': No hay diferencia entre' lib1/lib1.h' y p. Ej. 'boost/shared_ptr.hpp' excepto que están escritos por el mismo programador y residen en directorios hermanos (porque" en su mayoría trabajan juntos ", pero también pueden ser utilizados de forma independiente por otros colegas). Pero en mi caso usaría el primero con '" "' y el otro con '<>'. +1 para señalar que las rutas de inclusión siempre se usan como alternativa y el problema es más estético. –

2

voto que para la versión 2.

#include "../lib1/lib1.h" // 1 

Esto supone que el árbol siempre será la misma. Entonces, cuando cambies tu estructura, necesitarás modificar esto en todas partes.

#include "lib1/lib1.h" // 2 

No veo cuál es el problema de agregar src a la ruta include. En realidad, ni siquiera es necesario añadir src a la ruta de inclusión, se puede añadir directamente src/LIB1 y sólo tiene #include "lib1.h"

#include <lib1/lib1.h> // 3 

Este estilo de incluye se utiliza para las cabeceras del sistema. Debería evitar esto, ya que la mayoría de los programadores están acostumbrados a ver windows.h o string o vector dentro de <>. También le está diciendo al compilador que primero busque esos encabezados en los directorios predeterminados en lugar de los suyos propios. Yo evitaría este.

Nota al margen:

usted debe pensar en una estructura como esta:

src 
    +-- lib1 
    +-- lib1.h 
    +-- lib2 
    +-- lib2.h 
include 

en el directorio include contiene todos los encabezados visibles públicamente. Si lib1.h es público, muévelo allí. Si no, la estructura que tienes actualmente debería estar bien.

+0

¿Por qué el voto a favor? –

+0

Creo que te equivocas con '#include" lib1.h "', como ya he dicho, ambas bibliotecas deben instalarse y ser utilizables por otros proyectos. Así que incluir 'lib1/lib1.h' en lugar de simplemente' lib1.h' tiene la ventaja de que puede usarse en otros proyectos sin especificar otras rutas de inclusión que la predeterminada. Pero no fue mi voto negativo, por cierto :) –

Cuestiones relacionadas