2009-04-30 9 views
1

soutien que vous avez un programme C inclus par certains fichiers, et quelqu'un est constitué par d'autres, de façon suivante:Aidez-moi à créer un Makefile

---------------------------------------- 
File   | Included files   
---------------------------------------- 
main.c   | stdio.h, table.h 
---------------------------------------- 
list.c   | list.h 
---------------------------------------- 
symbol.c  | symbol.h 
---------------------------------------- 
table.c   | table.h 
---------------------------------------- 
table.h   | symbol.h, list.h 
---------------------------------------- 

s'il vous plaît aidez-moi à créer un makefile, je vous remercie beaucoup! Ceci est mon Makefile, mais il y a un problème? qui peut déboguer ces problèmes, merci!

hello: main.o table.o 
    gcc main.o table.o -o hello 

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

table.o: table.c table.h 
    gcc -c table.c 

symbol.o: symbol.c symbol.h 
    gcc -c symbol.c 

list.o: list.c list.h 
    gcc -c list.c 


clean: 
    rm hello *.o 
+0

Bien que pax vous ait donné un bon départ, son exemple repose toujours sur des suppositions (c'est-à-dire que l'exécutable 'principal' fonctionne à partir de toutes les sources). il se peut que les dépendances soient beaucoup plus complexes que cela et que son exemple soit complètement faux. – KevinDTimm

+0

Il existe des simplifications potentielles si nous connaissons la marque que vous utilisez (c'est-à-dire GNU, BSD, etc.). En outre, list.o est supposé être lié quelque part? – ctuffli

Répondre

6

est ici un début, pas exactement comment un professionnel le ferait, mais bon pour un niveau débutant:

hello: main.o list.o symbol.o table.o 
    gcc -o hello main.o list.o symbol.o table.o 

main.o: main.c table.h symbol.h list.h 
    gcc -c -o main.o main.c 

list.o: list.c list.h 
    gcc -c -o list.o list.c 

symbol.o: symbol.c symbol.h 
    gcc -c -o symbol.o symbol.c 

table.o: table.c table.h symbol.h list.h 
    gcc -c -o table.o table.c 

clean: 
    rm hello *.o 

Le problème spécifique avec votre makefile donné est que vous n'êtes pas relier à tous les les fichiers objets. Parce que main.c comprend table.h et table.h inclut symbol.h et list.h, votre programme aura certainement besoin de lier symbol.o et list.o ainsi.

Il est également conseillé de suivre les dépendances d'en-tête (par exemple, main.o dépend de table.hetsymbol.h/list.h parce table.h dépend de ces deux) - c'est parce qu'il n'y a aucun moyen « propre » pour obtenir un fichier intermédiaire pour les dépendances d'en-tête.

Et vous mettez rarement les en-têtes standard dans les fichiers make simplement parce qu'ils ne devraient pas changer - s'ils le font (nouveau compilateur), il suffit de les nettoyer et de les rendre frais.

+0

+1, un très bon exemple pour un débutant, y compris les dépendances d'en-tête. Je n'ai jamais été capable de les obtenir 'juste' en utilisant gcc -M. Proche, mais jamais parfait. –

Questions connexes