makefile - CFLAGS vs CPPFLAGS
autotools autoconf (3)
Entiendo que CFLAGS (o CXXFLAGS para C ++) son para el compilador, mientras que CPPFLAGS es utilizado por el preprocesador.
Pero todavía no entiendo la diferencia.
Necesito especificar una ruta de inclusión para un archivo de encabezado que se incluye con #include, porque #include es una directiva de preprocesador, ¿es el preprocesador (CPPFLAGS) lo único que me importa?
¿Bajo qué circunstancias necesito darle al compilador una ruta adicional de inclusión?
En general, si el preprocesador encuentra e incluye los archivos de encabezado necesarios, ¿por qué necesita que se le informe acerca de los directorios adicionales de inclusión? ¿Para qué sirve CFLAGS?
(En mi caso, en realidad encontré que AMBOS de estos me permiten compilar mi programa, lo que aumenta la confusión ... Puedo usar CFLAGS O CPPFLAGS para lograr mi objetivo (al menos en el contexto de autoconf). ¿Qué ocurre?)
La macro CPPFLAGS
es la que se utiliza para especificar directorios #include
.
Tanto CPPFLAGS
como CFLAGS
funcionan en su caso porque la regla make
(1) combina preprocesamiento y compilación en un comando (por lo que ambas macros se usan en el comando).
No necesita especificar como un directorio de inclusión si usa el formulario #include "..."
. Tampoco es necesario que especifique el directorio de inclusión del compilador estándar. Necesitas especificar todos los demás directorios de inclusión.
La regla de fabricación implícita para compilar un programa C es
%.o:%.c
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
donde la sintaxis $()
expande las variables. Como ambos CPPFLAGS
y CFLAGS
se usan en la llamada al compilador, que usted usa para definir rutas incluidas, es una cuestión de gusto personal. Por ejemplo, si foo.c
es un archivo en el directorio actual
make foo.o CPPFLAGS="-I/usr/include"
make foo.o CFLAGS="-I/usr/include"
llamará a su compilador exactamente de la misma manera, es decir
gcc -I/usr/include -c -o foo.o foo.c
La diferencia entre los dos entra en juego cuando tienes varios idiomas que necesitan la misma ruta include, por ejemplo, si tienes bar.cpp
entonces intenta
make bar.o CPPFLAGS="-I/usr/include"
make bar.o CFLAGS="-I/usr/include"
entonces las compilaciones serán
g++ -I/usr/include -c -o bar.o bar.cpp
g++ -c -o bar.o bar.cpp
como la regla implícita de C ++ también usa la variable CPPFLAGS
.
Esta diferencia le brinda una buena guía para usar: si desea que la bandera se use para todos los idiomas, CPPFLAGS
en CPPFLAGS
; si es para un idioma específico, CXXFLAGS
en CFLAGS
, CXXFLAGS
, etc. Ejemplos de este último tipo incluyen cumplimiento estándar. o banderas de advertencia: ¡no querría pasar -std=c99
a su compilador de C ++!
Puede terminar con algo como esto en tu archivo MAKE
CPPFLAGS=-I/usr/include
CFLAGS=-std=c99
CXXFLAGS=-Weffc++
Usted está detrás de las reglas implícitas de fabricación .