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 ambosCPPFLAGS
yCFLAGS
se 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.c
es 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
CPPFLAGS
variable.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
,CXXFLAGS
colóquela , 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 ++!Entonces podría terminar con algo como esto en su archivo MAKE
fuente
cpp
usandoCPPFLAGS
y esperar ningún resultado razonable, porque-std=c99
afecta 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
CPPFLAGS
macro es la que se usa para especificar#include
directorios.Ambos
CPPFLAGS
yCFLAGS
funcionan en su caso porque lamake
regla (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 -E
en 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á
# environment
datos. 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_PATH
es 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