makefile autotools autoconf

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++