Je comprends que CFLAGS (ou CXXFLAGS pour 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 fichier d'en-tête qui est inclus avec #include - parce que #include est une directive de préprocesseur, le préprocesseur (CPPFLAGS) est-il la seule chose qui me préoccupe?
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 jamais besoin d'être informé des répertoires d'inclusion supplémentaires? Quelle est l'utilité du CFLAGS?
(Dans mon cas, j'ai en fait trouvé que LES DEUX d'entre eux me permettent de compiler mon programme, ce qui ajoute à la confusion ... Je peux utiliser CFLAGS OU CPPFLAGS pour atteindre mon objectif (en contexte autoconf au moins).
Réponses:
La règle de fabrication implicite pour la compilation d'un programme C est
où la
$()
syntaxe étend les variables. Comme les deuxCPPFLAGS
etCFLAGS
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, sifoo.c
est un fichier dans le répertoire courantappellera tous les deux votre compilateur exactement de la même manière, à savoir
La différence entre les deux entre en jeu lorsque vous avez plusieurs langues qui ont besoin du même chemin d'inclusion, par exemple si vous avez
bar.cpp
essayéalors les compilations seront
car la règle implicite C ++ utilise également la
CPPFLAGS
variable.Cette différence vous donne un bon guide à utiliser - si vous voulez que l'indicateur soit utilisé pour toutes les langues, insérez-le
CPPFLAGS
, s'il s'agit d'une langue spécifique, insérez-leCFLAGS
,CXXFLAGS
etc. - vous ne voudriez pas passer-std=c99
à votre compilateur C ++!Vous pourriez alors vous retrouver avec quelque chose comme ça dans votre makefile
la source
cpp
utilisantCPPFLAGS
et vous attendre à un résultat raisonnable car cela-std=c99
affecte les symboles définis (en particulier au lieu des macros de test de fonctionnalités). Au lieu de cela, vous avez besoin$(CC) $(CPPFLAGS) $(CFLAGS) -E
.La
CPPFLAGS
macro est celle à utiliser pour spécifier les#include
répertoires.Les deux
CPPFLAGS
et leCFLAGS
travail dans votre cas parce que lemake
(1) La règle combine à la fois pré - traitement et la compilation dans une commande (afin que les deux macros sont 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 pas non plus besoin de spécifier le répertoire d'inclusion du compilateur standard. Vous devez spécifier tous les autres répertoires d'inclusion.la source
gcc -E
sur un fichier - il n'y a pas de #includes). La plupart des compilateurs modernes combinent les étapes de prétraitement et de compilation, vous n'avez donc pas à vous en soucier.Vous recherchez des règles de création implicites .
la source
Pour ajouter à ceux qui ont mentionné les règles implicites, il est préférable de voir ce que make a défini implicitement et pour votre env en utilisant:
Par exemple:
qui se dilate
Cela imprimera également les
# environment
données. Ici, vous trouverez le chemin d'inclusion de GCC parmi d'autres informations utiles.En make, quand il s'agit de chercher, les chemins sont nombreux, la lumière est une ... ou quelque chose à cet effet.
C_INCLUDE_PATH
est à l'échelle du système, placez-le dans votre shell*.rc
.$(CPPFLAGS)
est pour le préprocesseur include path.... ou encore plus spécifique
make utilise VPATH comme chemin de recherche général, utilisez donc avec prudence. Si un fichier existe à plusieurs emplacements répertoriés dans VPATH, make prendra la première occurrence de la liste.
la source