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 encabezado que se incluye con #include, ya que #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é es necesario que se le informe sobre directorios de inclusión adicionales? ¿Para qué sirve CFLAGS?
(En mi caso, descubrí 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?)

Respuestas:
La regla de creación implícita para compilar un programa en C es
donde la
$()sintaxis expande las variables. Como ambosCPPFLAGSyCFLAGSse usan en la llamada del compilador, el que use para definir rutas de inclusión es una cuestión de gusto personal. Por ejemplo, sifoo.ces un archivo en el directorio actualambos llamarán a su compilador exactamente de la misma manera, es decir
La diferencia entre los dos entra en juego cuando tiene varios idiomas que necesitan la misma ruta de inclusión, por ejemplo, si tiene
bar.cpp, intenteentonces las compilaciones serán
ya que la regla implícita de C ++ también usa la
CPPFLAGSvariable.Esta diferencia le brinda una buena guía para usar: si desea que la bandera se use para todos los idiomas, colóquela
CPPFLAGS, si es para un idioma específicoCFLAGS,CXXFLAGScolóquela , etc. Ejemplos de este último tipo incluyen cumplimiento estándar o banderas de advertencia - ¡no querría pasar-std=c99a su compilador de C ++!Entonces podría terminar con algo como esto en su archivo MAKE
fuente
cppusandoCPPFLAGSy esperar ningún resultado razonable, porque-std=c99afecta a los símbolos que se definen (en especial, en lugar de macros de prueba de funciones). En cambio, necesitas$(CC) $(CPPFLAGS) $(CFLAGS) -E.La
CPPFLAGSmacro es la que se usa para especificar#includedirectorios.Ambos
CPPFLAGSyCFLAGSfuncionan en su caso porque lamakeregla (1) combina el preprocesamiento y la compilación en un comando (por lo que ambas macros se usan en el comando).No es necesario especificarlo
.como un directorio de inclusión si usa el formulario#include "...". Tampoco es necesario especificar el directorio de inclusión del compilador estándar. Necesita especificar todos los demás directorios de inclusión.fuente
gcc -Een un archivo; no hay #includes). La mayoría de los compiladores modernos combinan los pasos de preprocesamiento y compilación, por lo que no tiene que preocuparse por esto.Lo que busca es hacer reglas implícitas .
fuente
Para agregar a aquellos que han mencionado las reglas implícitas, es mejor ver qué make ha definido implícitamente y para su env usando:
Por ejemplo:
que se expande
Esto también imprimirá
# environmentdatos. Aquí, encontrará la ruta de inclusión de GCC entre otra información útil.En make, cuando se trata de buscar, los caminos son muchos, la luz es una ... o algo por el estilo.
C_INCLUDE_PATHes para todo el sistema, configúrelo en su shell*.rc.$(CPPFLAGS)es para la ruta de inclusión del preprocesador.... o incluso más específico
make utiliza VPATH como ruta de búsqueda general, así que utilícelo con precaución. Si un archivo existe en más de una ubicación enumerada en VPATH, make tomará la primera aparición en la lista.
fuente