Je comprends que CFLAGS (ou CXXFLAGS pour C++) sont destinés au compilateur, alors que CPPFLAGS est utilisé par le pré-processeur.
Mais je ne comprends toujours pas la différence.
J'ai besoin de spécifier un chemin d'inclusion pour un fichier d'en-tête inclus avec #include - parce que #include est une directive de préprocesseur, le préprocesseur (CPPFLAGS) est-il la seule chose qui m'importe?
Dans quelles circonstances dois-je donner au compilateur un chemin d'inclusion supplémentaire?
En général, si le préprocesseur trouve et inclut les fichiers d'en-tête nécessaires, pourquoi a-t-il besoin d'être informé des répertoires d'inclusion supplémentaires? À quoi sert CFLAGS?
(Dans mon cas, j’ai trouvé que LES DEUX me permettent de compiler mon programme, ce qui ajoute à la confusion ... Je peux utiliser CFLAGS - [~ # ~] ou [~ # ~] CPPFLAGS pour atteindre mon objectif (dans le contexte autoconf au moins). Qu'est-ce qui donne? )
La règle de fabrication implicite pour la compilation d'un programme C est
%.o:%.c
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
où la syntaxe $()
développe les variables. Comme CPPFLAGS
et CFLAGS
sont utilisés dans l'appel du compilateur, que vous utilisez pour définir les chemins d'inclusion est une question de goût personnel. Par exemple si foo.c
Est un fichier dans le répertoire actuel
make foo.o CPPFLAGS="-I/usr/include"
make foo.o CFLAGS="-I/usr/include"
appellera votre compilateur de la même manière, à savoir
gcc -I/usr/include -c -o foo.o foo.c
La différence entre les deux entre en jeu lorsque vous avez plusieurs langues qui nécessitent le même chemin d’inclusion, par exemple si vous avez bar.cpp
, Puis essayez.
make bar.o CPPFLAGS="-I/usr/include"
make bar.o CFLAGS="-I/usr/include"
alors les compilations seront
g++ -I/usr/include -c -o bar.o bar.cpp
g++ -c -o bar.o bar.cpp
comme la règle implicite C++ utilise également la variable CPPFLAGS
.
Cette différence vous donne un bon guide pour utiliser - si vous voulez que le drapeau soit utilisé pour toutes les langues, mettez-le dans CPPFLAGS
, si c'est pour une langue spécifique, mettez-le dans CFLAGS
, CXXFLAGS
etc. Des exemples de ce dernier type incluent les drapeaux d'avertissement ou de conformité standard - vous ne voudriez pas passer -std=c99
à votre compilateur C++!
Vous pourriez alors vous retrouver avec quelque chose comme ça dans votre makefile
CPPFLAGS=-I/usr/include
CFLAGS=-std=c99
CXXFLAGS=-Weffc++
La macro CPPFLAGS
est celle à utiliser pour spécifier #include
répertoires.
CPPFLAGS
et CFLAGS
fonctionnent dans votre cas car la règle make
(1) combine le prétraitement et la compilation dans une commande (les deux macros sont donc utilisées dans la commande).
Vous n'avez pas besoin de spécifier .
comme répertoire d’inclusion si vous utilisez le formulaire #include "..."
. Vous n'avez également pas besoin de spécifier le répertoire d'inclusion standard du compilateur. Vous devez spécifier tous les autres répertoires d'inclusion.
Vous êtes après règles de fabrication implicites .