2010-02-25 2 views
0

J'ai un tas de fichiers dans des dossiers différents:pour mon utilisation de make programme

 
/ai/client.cpp # contains the main function 

/ai/utils/geometry.h 
/ai/utils/geometry.cpp 

/ai/world/world.h 
/ai/world/world.cpp 
/ai/world/ball.h 
/ai/world/ball.cpp 
/ai/world/bat.h 
/ai/world/bat.cpp 

Comment puis-je écrire un Makefile pour compiler ce programme? J'utilise Ubuntu.

+5

Avez-vous essayé de répondre à cette question par vous-même? Expliquez et montrez ce que vous avez de mieux à faire pour y répondre vous-même. Sinon Google "tutoriel Makefile". – mctylr

+0

ne pas oublier que ce site est pour la programmation des gourous, si vous n'avez pas déjà écrit votre premier OS système d'exploitation, ne vous attendez pas à trouver des réponses pour vous:) ... Je plaisante bien sûr, mais montrant un effort de base est (partout) bienvenu. – amirouche

+0

Je ne suis pas d'accord complètement. Selon la FAQ, "Aucune question n'est trop triviale ou trop" novice "", et "votre question est la bienvenue tant qu'elle intéresse au moins un autre programmeur quelque part". L'intérêt de ce site est que les gens ont * un * endroit où aller pour trouver des réponses à leurs questions de programmation, et que les réponses qu'ils trouvent ici sont raisonnablement à jour et de haute qualité. Google ne fournit aucun de ceux-ci. Il n'y a absolument pas besoin de google avant de poser des questions ici. (Cependant, faire une recherche sur SO est définitivement recommandé) – jalf

Répondre

2

Make est un outil polyvalent, et il y a beaucoup de subtilités différentes à utiliser. Cependant, vous pouvez garder les choses simples:

OBJ := ai/utils/geometry.o ai/world/world.o ai/world/ball.o ai/world/bat.o 

all: ai/client 
.PHONY: all # specific to GNU make, which is what Ubuntu provides 

ai/client: ai/client.o $OBJ 

# this rule means each .cpp file depends on its corresponding header 
# and, since the .o files depend on .cpp files (a builtin make rule), 
# they will be recompiled if the headers change 
# 
# you can also get more complex and generate dependencies automatically 
# look at the -MM option for gcc, for example 
%.cpp: %.h 
+0

Il y a une mise en garde dont je ne me souviens pas si elle s'applique dans ce cas: si le make par défaut est d'utiliser CC pour lier (ce qui signifie probablement la commande gcc), vous pourriez avoir besoin de CC: = g ++ dans le makefile pour lien vers le C++ stdlib (ou quelque chose de similaire, mais cela fonctionne assez bien si vous n'avez pas de programmes C compilés par ce makefile). –

+0

@Roger: GNU make devrait utiliser '$ (CXX)' par défaut pour la compilation du code C++, et * cela * devrait être par défaut 'g ++'. * Ne le * dites pas d'utiliser 'g ++' pour le compilateur c! – dmckee

+0

@dmckee: Compilation, oui, mais le problème est * linking *. Sur ma machine virtuelle Ubuntu, faites des utilisations (comme vu à travers 'make -p') CC pour lier tous les fichiers * .o, qu'ils proviennent de fichiers source C ou C++. Y a-t-il un paramètre de configuration qui me manque? –

0
  1. vous devriez vérifier que vous avez installé g ++ et build-essential
  2. here est un aperçu de la Consorsium magie noire makefile
  3. Je pense que faire 1 est conscient en train d'écrire le répertoire monrépertoire /myfile.cpp devrait bien fonctionner
  4. le reste est des commandes de base de g ++ mais le tutoriel sur 1 devrait suffire :)

1 le programme qui exécute makefiles

+0

c'était un bon lien! – amirouche

+2

lmgtfy .com est un lien interdit car il est considéré comme offensant. Le cacher derrière un raccourcisseur d'URL est deux fois plus mauvais. Ne fais pas ça. Votre lien mis à jour est beaucoup mieux. –

-1

Premier résultat dans google: http://www.opussoftware.com/tutorial/TutMakefile.htm

semble être un très bon tutoriel. Doit être assez simple à comprendre, notez qu'ils parlent de la version GNU de make, qui est ce qui est le plus couramment utilisé. Il y a aussi la version BSD mais si vous utilisez un système d'exploitation basé sur BSD (comme OpenBSD, NetBSD ou FreeBSD .. quelqu'un connaît Mac OSX?)

+0

Donc, ce que vous dites, c'est que vous ne connaissez pas la réponse, mais que vous répétez stupidement Google et * espérant * que le résultat que vous avez trouvé est correct. Comment cela aide-t-il le PO? – jalf

+0

Si vous voulez dire que je ne vais pas leur donner un makefile tout codé et prêt pour eux de copier et coller, alors oui. J'ai examiné ce tutoriel, et c'est bon. Je ne vais pas essayer de le résumer parce que make est trop complexe à expliquer dans l'une de ces petites réponses. Je souhaite que le demandeur comprenne le code donné, pas simplement copier et coller aveuglément. – Earlz

+0

Même si je suis d'accord avec vous sur le reste, un véritable exemple de travail qu'il peut copier et coller est un excellent ajout à un bon tutoriel (et les meilleurs tutoriels incluent des exemples de travail eux-mêmes). Être capable de modifier et d'essayer quelque chose pendant que vous lisez est essentiel à la façon dont certaines personnes apprennent. –

0

son fonctionnement merci tous pour vos précieux commentaires spécialement pour le liens sur le post précédent j'ai oublié d'écrire le fichier client.cpp sur la ligne 6 mais mon erreur était que j'avais inclus un en-tête avec une erreur dans le client.cpp et il ne pourrait jamais le trouver.

Questions connexes