2010-09-02 3 views
3

Je travaille sur l'un de mes premiers projets qui couvrira plus d'un fichier C. Pour mes premiers programmes de pratique en couple, j'ai juste écrit mon code en main.c et compilé en utilisant gcc main.c -o main. Cela a fonctionné pour moi pendant que j'apprenais.Qu'est-ce qu'un workflow efficace avec C? - Makefile + bash script

Maintenant, je travaille sur un projet beaucoup plus important par moi-même. Je veux continuer à faire la compilation moi-même (ou au moins la configurer manuellement) pour que je puisse comprendre le processus. Après avoir lu un peu, j'ai décidé de faire un Makefile.

Note: J'utilise également GTK +, donc j'ai dû chercher comment ajouter cela dans la commande de compilation.

C'est à quoi il ressemble après un peu de recherche:

main: 
    gcc -Wall -g main.c -o main `pkg-config --cflags --libs gtk+-2.0` 

Au début, je ne faisais que courir « faire ». Ensuite, j'ai eu quelques problèmes pour obtenir l'erreur "Main est à jour" même si j'avais changé le fichier.

J'ai donc écrit un script:

#!/bin/bash 
rm main 
make 
./main 

Alors je fais des changements, et puis j'exécuter ce script.

Est-ce un bon système/normal? Je veux avoir un système évolutif, puisque mon projet va grandir. Je suppose que je peux garder ce script et juste ajouter des dépendances au makefile et changer la commande de compilation principale dans le makefile. Ai-je raison?

Merci d'avance.

EDIT:

Merci pour les commentaires sur la façon de réparer mon Makefile.

Est-ce que le processus de compilation type 1) type make puis 2) ./main indépendamment de la façon dont le projet est configuré ou sa taille (en supposant que vous avez écrit un makefile approprié)?

+1

Oui, vous avez raison. Vous faites d'abord un 'make' et ensuite faire un'./Main' – codaddict

+0

Super, merci! Semble plutôt facile à apprendre jusqu'à présent. – mouche

Répondre

10

Vous devez dire que main dépend de main.c. De cette façon, chaque fois que vous apportez des modifications à main.c puis exécutez make, main est régénéré. Pour supprimer main vous pouvez avoir une cible appelée phony clean comme:

main:main.c 
    gcc -Wall -g main.c -o main `pkg-config --cflags --libs gtk+-2.0` 

.PHONY: clean 
clean: 
    rm -f main 

Maintenant supprimer main vous pouvez faire: make clean

Si vous obtenez make: main is up to date. Cela signifie que vous ne l'avez pas modifié main.c et donc il n'y a pas besoin de régénérer main. Mais si vous devez forcer la régénération main même lorsque les dépendances n'ont pas été mises à jour, vous pouvez également utiliser l'option -B de make comme suggéré par Sjoerd dans une autre réponse.

+4

Il est utile d'ajouter une ligne '.PHONY: clean' au-dessus de la cible' clean' juste au cas où un fichier nommé 'clean' (un script shell par exemple) se retrouve dans le répertoire. Si cela se produit, make va voir le fichier et ne pas exécuter la cible propre. "PHONY" lui dit de ne même pas regarder. – aaronasterling

+0

Commentaire très utile, @aaron. Merci. – mouche

3
  • Utilisez make -B ou make --always-make pour compiler même si la cible est à jour
  • Append les noms de fichiers après les deux points pour vérifier si ceux-ci sont mis à jour.

Exemple:

a: a.c 
     gcc -o a a.c 

a serait seulement construit si a.c est plus récente que a.

+0

Pour un projet plus important, 'make -B' n'est probablement pas ce que les gens veulent utiliser. –

+0

Droite. -B serait utile si l'heure de modification de certains fichiers est incorrecte. Cela arrive par exemple lorsque vous copiez quelque chose sur votre fichier de sortie. – Sjoerd

3

Je trouve la ligne de commande make assez complète pour mes besoins, mais écrire Makefiles à la main devient une corvée. Au fur et à mesure que votre projet se développe en complexité, vous trouverez que gérer les dépendances à la main devient de plus en plus ennuyeux. Ce que je vous suggère de faire est d'apprendre comment faire au moins un des éléments suivants:

  • Ecrire un suivi dépendance Makefile en appelant par exemple, gcc -M.
  • Apprenez à utiliser un générateur Makefile tel que automake ou CMake. Personnellement, je préfère automake parce qu'il est plus mature (et ne fait pas des choses stupides comme essayer de mettre des listes séparées par des points-virgules sur une ligne de commande).
+0

+1 pour mentionner les générateurs Makefile disponibles. Je vais les vérifier. – mouche