CFLAGS, CCFLAGS, CXXFLAGS-que contrôlent exactement ces variables?
J'utilise GNU make pour compiler mon code C++, et j'aimerais comprendre comment rendre mes compilations personnalisables.
, j'ai lu à différents endroits que CFLAGS
, CCFLAGS
et CXXFLAGS
sont utilisés à cette fin. Alors, comment dois-je utiliser? Si j'ai des arguments de ligne de commande supplémentaires pour le compilateur, devrais-je les ajouter à CFLAGS
ou les ajouter? Est-il une pratique courante?
Pourquoi les trois variables différentes? Je suppose que le compilateur C devrait obtenir CFLAGS
et CCFLAGS
, tandis que le C++ compilateur doit obtenir CFLAGS
et CXXFLAGS
- ai-je raison?
L'utilisateur humain est-il censé définir ces variables? Faire des outils automatiques(automake
, autoconf
, etc) les définir? Le système linux que je suis censé utiliser ne définit aucune de ces variables - est-ce typique?
Actuellement, mon Makefile ressemble à ceci, et je pense que c'est un peu sale:
ifdef code_coverage
GCOV_FLAG := -fprofile-arcs -ftest-coverage
else
GCOV_FLAG :=
endif
WFLAGS := -Wall
INC_FLAGS := -Istuff -Imore_stuff -Ietc
CCFLAGSINT := -O3 $(WFLAGS) $(INC_FLAGS) $(CCFLAGS)
... (somewhere in the makefile, the command-line for compilation looks like this)
$(CC) $(CCFLAGSINT) -c $< -o $@
... (somewhere in the makefile, the command-line for linking looks like this)
$(CC) $(GCOV_FLAG) $(CCFLAGSINT) $(OBJLIST) $(LDFLAGS) -o $@
Je suis sûr qu'il n'y a pas de bugs ici; le Makefile fonctionne très bien. Mais y a t il quelque chose qui va à l'encontre conventions (comme CCFLAGSINT
- devrais-je simplement écraser CCFLAGS
à la place? Ou CXXFLAGS
? FUD!)
Désolé pour tant de questions; vous n'y répondrez évidemment pas toutes, mais j'espère que les réponses m'aideront à comprendre l'idée générale derrière ces paramètres.
2 réponses
Comme vous l'avez remarqué, ce sont des Makefile {macros ou variables}, pas des options de compilation. Ils mettent en œuvre un ensemble de conventions. (Macros est un ancien nom pour eux, encore utilisé par certains. GNU make doc appelle les variables.)
La seule raison pour laquelle les noms comptent est les règles make par défaut, visibles via make -p
, qui en utilisent certaines.
Si vous écrivez toutes vos propres règles, vous pouvez choisir tous vos propres noms de macros.
Dans une marque GNU vanille, il N'y a pas de CCFLAGS. Y sont CFLAGS
, CPPFLAGS
, et CXXFLAGS
. CFLAGS
pour le compilateur C, CXXFLAGS
, pour le C++, et CPPFLAGS
pour les deux.
Pourquoi CPPFLAGS
est-il dans les deux? Classiquement, c'est la maison des drapeaux du préprocesseur(-D
, -U
) et c et c++ les utilisent. Maintenant, l'hypothèse que tout le Monde veut le même environnement de définition pour c et c++ est peut-être discutable, mais traditionnel.
P.S. comme l'a noté James Moore , certains projets utilisent CPPFLAGS pour les drapeaux du compilateur C++, pas les drapeaux du C préprocesseur. Le NDK Android, pour un exemple énorme.
Selon le manuel GNU make
:
CFLAGS: drapeaux supplémentaires à donner au compilateur C.
CXXFLAGS: drapeaux supplémentaires à donner au compilateur C++.
Cppflags: drapeaux supplémentaires à donner au préprocesseur C et aux programmes qui l'utilisent (les compilateurs C et Fortran).
Src: https://www.gnu.org/software/make/manual/make.html#index-CFLAGS
note: PP signifie préprocesseur (et non Plus Plus), c'est-à-dire
CPP: programme pour exécuter le C préprocesseur, avec des résultats à la sortie standard; par défaut '$(CC) - E'.
Ces variables sont utilisées par les règles implicites de make
Compilation des programmes C
N. o est fait automatiquement à partir de N. c avec une recette de la forme
‘$(CC) $(CPPFLAGS) $(CFLAGS) -c".Compilation des programmes C++
N. o est fait automatiquement à partir de n.cc, n.cpp, ou N. C avec une recette de la forme
‘$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c".
Nous vous encourageons à utiliser le suffixe ‘.cc " pour les fichiers source C++ au lieu de ‘.C’.
Src: https://www.gnu.org/software/make/manual/make.html#Catalogue-of-Rules