web-dev-qa-db-fra.com

CFLAGS vs CPPFLAGS

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? )

92
EBM

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++
144
Scott Wales

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.

10
Steve Emmerson
4