Makefile pour compiler plusieurs programmes en C?
C'est un incroyablement simple question, mais je suis nouveau sur makefiles. Je suis en train de faire un makefile qui va compiler les deux programmes indépendants:
program1:
gcc -o prog1 program1.c
program2:
gcc -o prog2 program2.c
Tous les exemples en ligne aller dans la façon dont plus de détails que j'ai besoin et qui sont source de confusion! Tout ce que je veux vraiment faire est d'exécuter les deux gcc
lignes. Ce que je fais mal?
- Les réponses ci-dessous sont très claires, mais vous pouvez aussi exécuter la ligne de commande:
make program1 program2
qui invoque à la fois la cible dans l'exemple que vous avez donné vous-même. Si vous voulez justeprogram1
, vous pouvez exécuter simplementmake
(il sera exécuté la première cible). Si vous voulez justeprogram2
, exécutezmake program2
. Vous avez plus de contrôle. Et bien sûr, une cibleall: program1 program2
permettra de faire exactement cela (le fait d'être la première, l'exécution de vos 2 autres objectifs). Fait.
Vous devez vous connecter pour publier un commentaire.
Faire comme si
Vous avez dit que vous ne voulez pas avancé, mais vous pouvez également raccourcir comme cela repose sur quelques règles par défaut.
all
cible doit apparaître avant le programmes individuels dans le fichier makefile, et être la première cible dans le makefile.all
ou toute autre cible où vous le souhaitez et d'en faire la valeur par défaut pour la cible de moins en moins (ce que vous avez appelé "automatique"), qui s'exécute demake
à l'aide de.DEFAULT_GOAL:=all
.make
?.SECONDEXPANSION
?PRG_SUFFIX
. Si vous ne voulez pas de suffixe, ensemblePRG_SUFFIX=""
. Sinon, si vous définissezPRG_SUFFIX=
ou de supprimer cette ligne comme#PRG_SUFFIX=.exe
, vous obtiendrez laerror: no such file or directory: 'all.o'
erreur.Modèle de règles vous permettent de compiler plusieurs c les fichiers qui nécessitent les mêmes commandes de compilation à l'aide de
make
comme suit:Un programme simple compilation de flux de travail est simple, je peux le dessiner comme un petit graphique: source -> [compilation] -> object [liaison] -> fichier exécutable. Il y a fichiers (source, objet, exécutable) dans ce graphique, et règles (faire's de la terminologie). Ce graphe est défini dans les Makefile.
Lorsque vous lancez le faire, il lit Makefile, et vérifie changé fichiers. Si il y a de tout, il déclenche la règle, qui en dépend. Le règle peut produire/mise à jour fichiers, qui peuvent déclencher d'autres règles et ainsi de suite. Si vous créez un bon makefile, seulement le nécessaire règles (compilateur/lien commandes) sera exécuté, ce qui signifie "à côté" du fichier modifié dans la dépendance de chemin.
Choisir un exemple Makefile, lisez le manuel de syntaxe (de toute façon, il est évident première vue, w/o mode d'emploi), et dessiner le graphe. Vous devez comprendre les options du compilateur afin de trouver les noms des fichiers de résultats.
Le faire graphique doit être aussi complexe, tout comme vous le souhaitez. Vous pouvez même faire des boucles infinies (ne pas faire)! Vous pouvez dire faire, dont la règle est de votre cible, de sorte que seule la gauche debout fichiers seront utilisés comme déclencheurs.
De nouveau: dessiner le graphe!.
J'ai plutôt l'ansi et pédant, un meilleur contrôle de votre programme. Il ne vous laissera pas de compilation que vous avez encore des avertissements !!
-pedantic
est pour.-pedantic
va supprimer toute non-fonctionnalités ansi que même-ansi
permis.-Werror
va changer les avertissements d'erreurs.make all
fera:Si vous définissez
CXX
etCXXFLAGS
variablesmake
les utiliser.a.cpp -o a
?