CFLAGS vs CPPFLAGS


Entiendo que CFLAGS (o CXXFLAGS para C++) son para el compilador, mientras que CPPFLAGS es usado por el preprocesador.

Pero todavía no entiendo la diferencia.

Necesito especificar una ruta de inclusión para un archivo de cabecera que se incluye con #include because 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 de inclusión adicional?

En general, si el preprocesador encuentra e incluye los archivos de encabezado necesarios, ¿por qué necesita que se le informe sobre los directorios de inclusión adicionales? ¿Para qué sirven los CFLAGS?

(En mi caso, realmente encontré que AMBOS de estos me permiten compilar mi programa, lo que se suma a la confusión... Puedo usar CFLAGS O CPPFLAGS para lograr mi objetivo (al menos en el contexto de autoconf). ¿Qué pasa?)

Author: EBM, 2010-05-03

3 answers

La regla make implícita para compilar un programa C es

%.o:%.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

Donde la sintaxis $() expande las variables. Como CPPFLAGS y CFLAGS se utilizan en la llamada del compilador, que se utiliza para definir rutas de inclusión 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"

Ambos llamarán a su compilador exactamente de la misma manera, a saber

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 de inclusión, por ejemplo si tiene bar.cpp entonces intente

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 regla implícita de C++ también usa la variable CPPFLAGS.

Esta diferencia le da una buena guía para usar-si desea que la bandera se use para todos los idiomas póngala en CPPFLAGS, si es para un idioma específico póngala en CFLAGS, CXXFLAGS etc. Ejemplos de este último tipo incluyen el cumplimiento estándar o banderas de advertencia - no querrá pasar -std=c99 a el compilador de C++!

Entonces podría terminar con algo como esto en su makefile

CPPFLAGS=-I/usr/include
CFLAGS=-std=c99
CXXFLAGS=-Weffc++
 128
Author: Scott Wales,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-03 07:29:16

La macro CPPFLAGS es la que se usa para especificar directorios #include.

Tanto CPPFLAGS como CFLAGS funcionan en su caso porque la regla make (1) combina el preprocesamiento y la compilación en un solo comando (por lo que ambas macros se utilizan en el comando).

No necesita especificar . como un directorio include si usa el formulario #include "...". Tampoco es necesario especificar el directorio de inclusión del compilador estándar. Es necesario especificar todos los demás directorios incluidos.

 9
Author: Steve Emmerson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-23 11:00:14

Estás detrás de reglas implícitas de make.

 3
Author: Nikolai Fetissov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-02 21:07:52