126 votes

CFLAGS vs CPPFLAGS

Je comprends que CFLAGS (ou CXXFLAGS pour le C++) sont pour le 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 en-tête de fichier qui est inclus avec #include -- parce que #include est une directive de préprocesseur, est le préprocesseur (CPPFLAGS) la seule chose que je me soucie?

Dans quelles circonstances ai-je besoin pour donner le compilateur un supplément incluent chemin?

En général, si le préprocesseur trouve et comprend le besoin de fichiers d'en-tête, pourquoi ne fait-il jamais besoin d'être dit à propos de extra inclure des répertoires? Quel est CFLAGS à tous?

(Dans mon cas, j'ai effectivement trouvé que DEUX de ces permettez-moi de compiler mon programme, ce qui ajoute à la confusion... je peux utiliser la variable CFLAGS OU CPPFLAGS pour accomplir mon objectif (en autoconf contexte au moins). Ce qui donne?)

179voto

Scott Wales Points 5217

L'implicite faire règle pour la compilation d'un programme C est

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

où l' $() de la syntaxe élargit les variables. Comme les deux CPPFLAGS et CFLAGS sont utilisés dans le compilateur appel, 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 courant

make foo.o CPPFLAGS="-I/usr/include"
make foo.o CFLAGS="-I/usr/include"

permettra tout à la fois votre compilateur exactement de la même manière, à savoir

gcc -I/usr/include -c -o foo.o foo.c

La différence entre les deux est en jeu lorsque vous avez plusieurs langues qui ont besoin de la même inclure de chemin d'accès, par exemple, si vous avez bar.cpp alors essayez

make bar.o CPPFLAGS="-I/usr/include"
make bar.o CFLAGS="-I/usr/include"

ensuite, les compilations seront

g++ -I/usr/include -c -o bar.o bar.cpp
g++ -c -o bar.o bar.cpp

comme le C++ règle implicite utilise également l' CPPFLAGS variable.

Cette différence vous donne un bon guide pour qui à utiliser - si vous voulez le drapeau à être utilisé pour toutes les langues de la mettre dans CPPFLAGS, si c'est pour une langue spécifique mis en CFLAGS, CXXFLAGS etc. Des exemples de ce dernier type d'inclure le respect des standards ou des drapeaux, vous ne voulez pas passer -std=c99 de votre compilateur C++!

Vous pouvez ensuite retrouver avec quelque chose comme ceci dans votre fichier makefile

CPPFLAGS=-I/usr/include
CFLAGS=-std=c99
CXXFLAGS=-Weffc++

14voto

Steve Emmerson Points 4161

La macro CPPFLAGS est celle à utiliser pour spécifier les répertoires #include.

CPPFLAGS et CFLAGS fonctionnent tous les deux dans votre cas car la règle make (1) combine le prétraitement et la compilation en une seule commande (les deux macros sont donc utilisées dans la commande).

Vous n'avez pas besoin de spécifier "." en tant que 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.

3voto

Nikolai N Fetissov Points 52093

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X