2011-11-02 21 views
5

Actualmente estoy tratando de obtener un programa para compilar en un sistema que no tengo control.Anular la ruta de búsqueda del encabezado predeterminado

El problema que estoy teniendo es los directorios incluir este aspecto:

/usr/include: 
gmpxx.h gmp.h 

/usr/local/include: 
gmp.h 

En mi cpp, utilizo

#include <gmpxx.h> 

y esto encuentra el archivo correcto en /usr/include, sin embargo cuando gmpxx.h incluye gmp.h, lo saca de /usr/local/include, lo que rompe la compilación.

En este momento, veo 3 soluciones muy feas al problema

  1. En mi cpp, añadir #include </usr/include/gmp.h>
    Tener un absoluto ruta de inclusión es bastante feo y no portátiles, y creo que esto una especie de cosa debería pertenecer al Makefile en lugar de a la fuente.

  2. añadir la bandera -nostdinc a mi makefile, y especificar las rutas incluir a mano

  3. crear enlaces simbólicos locales a las bibliotecas que realmente quiero, y luego hacer incluye locales (#include "gmp.h")

¿Hay alguna solución mejor que me falta?

+0

¿se le permite modificar gmpxx.h? –

+0

No lo soy, lo único que puedo cambiar es que los archivos locales (cpp, makefile) – cobbal

+0

# 2 tienen mucho sentido. Makefile muestra cómo construir el archivo. Otros dos parecen hackish. –

Respuesta

12

caminos La búsqueda incluye son tomadas en el siguiente orden:

Entonces, puede usar cualquiera de los dos primeros (lo que parezca mejor/más conveniente para sus propósitos).

+0

No lo he intentado CPLUS_INCLUDE_PATH, pero el problema con -I es que si le da un directorio en los valores predeterminados estándar ignora el orden y no lo pone primero. – cobbal

+0

@cobbal: Veo lo que estás diciendo; Sí, eso se menciona en la documentación a la que me he vinculado. Menciona dos soluciones: '-nostdinc' (que ya conoce, y encuentra feo, de lo que estoy de acuerdo), y' -isystem' (vea http://gcc.gnu.org/onlinedocs/ gcc-4.3.2 // gcc/Preprocessor-Options.html). – ruakh

+0

Parece que CPLUS_INCLUDE_PATH era exactamente lo que se necesitaba. Gracias – cobbal

0

Quitar gmp.h de/usr/local/include, o averiguar por qué tiene una distribución de software que quiera tener gmp.h en include/usr/local/y quitar la distribución. Creo que el problema se debe a que, por alguna razón, tiene dos conjuntos de archivos de encabezado conflictivos para GMP. Si tiene una instalación estándar de archivos de desarrollo GMP en su sistema (/ usr/include/...), no debería haber una razón para tener otro conjunto de encabezados en/usr/local/include /.

No hay manera limpia para solucionarlo de otra manera, ya que debe incluir gmpxx.h usando paréntesis angulares

#include <gmpxx.h> 

como lo hace. Ahora gmpxx.h incluye gmp.h usando paréntesis angulares también, y en su sistema/usr/local/include tiene prioridad sobre/usr/include, que tiene sentido.

Así que te recomiendo que averigües por qué hay dos gmp.h's y eliminas el falso. Hay algo sospechoso en la configuración del archivo de encabezado.

No se puede revender fácilmente/usr/include y/usr/local/include porque se consideran directorios de sistema incluidos y si intenta utilizar -I en ellos, GCC ignorará la opción.

+1

Si bien esto sería ideal, realmente no puedo modificar los encabezados ya que es una máquina de la escuela. Como no puedo hacer esto, voy con el trabajo más limpio. – cobbal

+0

LOL buena razón :) –

Cuestiones relacionadas