2010-04-09 4 views
25

(Je suis sous Linux Ubuntu 9.10, donc l'extension pour un exécutable est executablefile.out) Je suis en train de me lancer dans la programmation modulaire (programmation avec plusieurs fichiers) en C et je veux savoir comment compiler plusieurs fichiers dans un seul makefile. Par exemple, quel serait le makefile pour compiler ces fichiers: main.c, dbAdapter.c, dbAdapter.h? (En passant, si vous ne l'avez pas encore compris, la fonction principale est dans main.c) Est-ce que quelqu'un pourrait aussi poster un lien vers la documentation d'un fichier makefile?Compilez plusieurs fichiers C avec make

Répondre

26

Voir mes Makefile Tutorial: How To Write A Makefile. Il fournit un Makefile bien conçu qui va construire un tel projet (avec plusieurs fichiers sources C et C++), explique comment cela fonctionne, et met en garde contre les pièges courants ainsi que les mauvaises pratiques de makefile qui sont trop fréquentes pour se rencontrer dans la nature .

+1

Je viens de le mettre à jour et je serais heureux d'avoir des commentaires. –

+2

Lien est mort dès maintenant. – Pat

+0

@MichaelAaronSafyan Puisque vous visez un support multiplate-forme, avez-vous des conseils pour nettoyer le fichier programme lorsque Windows le sort en $ (program_NAME) .exe? –

32

Les liens affichés sont tous bons. Pour vous cas particulier, vous pouvez essayer cela. Essentiellement tous les Makefiles suivent ce modèle. Tout le reste est des raccourcis et des macros.

program: main.o dbAdapter.o 
    gcc -o program main.o dbAdapter.o 

main.o: main.c dbAdapter.h 
    gcc -c main.c 

dbAdapter.o dbAdapter.c dbAdapter.h 
    gcc -c dbAdapter.c 

L'essentiel est ici que le Makefile regarde les règles de manière séquentielle et construit que certains éléments sont nécessaires.

Il va d'abord regarder le programme et voir que pour construire le programme, il a besoin de quelque chose appelé main.o et dbAdapter.o.

Il trouvera alors main.o. Cependant, pour construire main.o, il aura besoin de main.c et de dbAdapter.h (je suppose que dbAdapter.h est inclus dans main.c).

Il utilisera ces sources pour construire main.o en le compilant avec gcc. Le -c indique que nous voulons seulement compiler.

Il fait la même chose avec dbAdapter.o. Quand il a ces deux fichiers objets, il est prêt à les lier. Il utilise également le compilateur gcc pour cette étape. Le -o indique que nous créons un fichier appelé programme.

+3

... sauf que vous ne devriez pas coder en dur le compilateur, et vous devriez tirer parti des règles de construction prédéfinies ... voir mon tutoriel. –

+5

Bien sûr, vous avez raison. Mais l'OP est relativement nouveau pour Makefiles et je voulais juste montrer le processus sous-jacent sans aucune indirection. – aduric

+3

"Mais l'OP est relativement nouveau pour Makefiles" - vous devriez le mettre sur la bonne voie plutôt que de mettre des erreurs communes dans son premier exemple. – mk12

Questions connexes