2009-02-04 7 views
10

Estoy intentando compilar un programa sencillo, cong ++ incluye todos/usr/include recursiva

#include <gtkmm.h> 

El camino a gtkmm.h es /usr/include/gtkmm-2.4/gtkmm.h. g ++ no ve este archivo a menos que específicamente lo diga -I /usr/include/gtkmm-2.4.

Mi pregunta es, ¿cómo puedo tener g ++ automáticamente buscar recursivamente a través de todos los directorios en /usr/include para todos los archivos de encabezado que figuran en él, y ¿por qué no es esta la acción predeterminada?

Respuesta

16

En este caso, lo correcto es utilizar pkg-config en sus Makefile o buildscripts:

# Makefile 
ifeq ($(shell pkg-config --modversion gtkmm-2.4),) 
    $(error Package gtkmm-2.4 needed to compile) 
endif 

CXXFLAGS += `pkg-config --cflags gtkmm-2.4` 
LDLIBS += `pkg-config --libs gtkmm-2.4` 

BINS = program 
program_OBJS = a.o b.o c.o 

all: $(BINS) 

program: $(program_OBJS) 
     $(CXX) $(LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) -o [email protected] 

# this part is actually optional, since it's covered by gmake's implicit rules 
%.o: %.cc 
     $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o [email protected] 

Si echa de menos gtkmm-2.4, esto producirá

$ make 
Package gtkmm-2.4 was not found in the pkg-config search path. 
Perhaps you should add the directory containing `gtkmm-2.4.pc' 
to the PKG_CONFIG_PATH environment variable 
No package 'gtkmm-2.4' found 
Makefile:3: *** Package gtkmm-2.4 needed to compile. Stop.

De lo contrario, obtendrá todas las rutas adecuadas y las bibliotecas absorbidas por usted, sin especificarlas todas a mano. (Compruebe la salida de pkg-config --cflags --libs gtkmm-2.4: eso es mucho más de lo que desea escribir a mano, nunca).

+1

Supongo que acabo de abrir un nuevo dolor de cabeza para que lo lea. OK gracias – endeavormac

1

No puede. El objetivo de incluir rutas es para que pueda escoger y elegir qué desea y qué versiones.

Lo que podría hacer es ..

#include <gtkmm-2.4/gtkmm.h> 

que lograría el mismo efecto.

+1

El problema con esto es que gtkmm.h solo incluye un montón de otros encabezados con una ruta relativa a su ubicación que g ++ no puede encontrar .. :/. Es irritante Supongo que podría ir y reemplazar todas las rutas en gtkmm.h, pero estoy esperando otra solución. – endeavormac

+0

@endeavormac: ¿qué forma incluye el familiar en gtkmm.h? Básicamente, se espera que especifique el directorio donde se encuentra gtkmm.h a través de -I y que, probablemente, funcione correctamente. Sin eso, no lo hará. Punto final, o punto, si lo prefiere. ¿Por qué quieres luchar contra el diseño? –

+0

Lo que Jon dijo :) –

2

Supongo que no está utilizando un archivo MAKE? Lo único que podría ser molesto es tener que escribir la opción larga -I cada vez que compile su programa. Un makefile lo hace mucho más fácil.

Por ejemplo, se puede modificar el hola mundo makefile de wikipedia a algo como lo siguiente:

INC=-I/usr/include/gtkmm-2.4/ 

helloworld: helloworld.o 
    g++ -o [email protected] $< 

helloworld.o: helloworld.c 
    g++ $(INC) -c -o [email protected] $< 

.PHONY: clean 

clean: 
    rm -f helloworld helloworld.o