Problème de Makefile [Résolu]

Problème de Makefile [Résolu] - C++ - Programmation

Marsh Posté le 01-06-2007 à 04:21:29    

Bonjour
voilà mon Makefile:
 

Code :
  1. CC=g++
  2. CFLAGS= -I/usr/include/GL -I/usr/include/SDL
  3. DEBUG=-g
  4. OPTI=-02
  5. MODE=$(DEBUG)
  6. SDL=-L/usr/X11R6/lib -lX11 -lXext `sdl-config --cflags --libs`
  7. OPENGL=-lGL -lGLU -lglut
  8. EXE=strategie
  9. all: $(EXE)
  10. %.o: %.cpp %.hpp
  11. $(CC) $(CFLAGS) -c -Wall -ansi $(MODE) $<
  12. $(EXE): serveur.o joueur.o carte.o texture.o unite.o objet3d.o uniteMobile.o uniteCarte.o rectangle.o pave.o menu.o arme.o particule.o projectile.o main.o
  13. $(CC) $(CFLAGS) $+ -o $@  -Wall -ansi $(MODE) $(SDL) $(OPENGL)
  14. main.o:constantes.hpp serveur.hpp constantes.hpp
  15. serveur.o: serveur.hpp coord.hpp joueur.hpp constantes.hpp uniteCarte.hpp unite.hpp
  16. ...


 
 
Lorsque je fais make, tout se passe bien au début voici quelques lignes du résultat:
g++ -I/usr/include/GL -I/usr/include/SDL -c -Wall -ansi -g serveur.cpp
g++ -I/usr/include/GL -I/usr/include/SDL -c -Wall -ansi -g joueur.cpp
 
mais à la fin, pour construire main.o, j'ai cette ligne:
g++    -c -o main.o main.cpp
 
je ne sais pas pourquoi, mais d'un coup, il décide que $(CFLAGS) est inutile, ce qui bien sur provoque une cascade d'erreurs de compilation
Pourtant il devrait utiliser la même règle que pour les autres fichiers (d'ailleurs il n'y en a pas d'autres dans mon Makefile).
Et que vient faire ce -o qui se rajoute? d'où vient cette règle?
 
Si qqn comprend, merci de me faire signe


Message édité par ptitchep le 02-06-2007 à 13:22:29

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 01-06-2007 à 04:21:29   

Reply

Marsh Posté le 02-06-2007 à 11:22:35    

La réponse est dans la doc. CC/CFLAGS pour le C, CXX/CXXFLAGS pour le C++.

Reply

Marsh Posté le 02-06-2007 à 12:12:03    

une variable n'est pas juste une variable? en quoi le nom de CC ou CXX change quelque chose à l'évaluation de $(CC) ou $(CXX) le makefile n'est pas juste un script? Et pourquoi les problèmes surgissent seulement pour main.o?
 
Effectivement ça fonctionne avec CXXFLAGS mais pourquoi ai-je une règle spéciale pour main.cpp? Dans mon Makefile, il a une règle comme les autres et je veux qu'il la suive! Pourquoi pour construire main.o la ligne serait
 
g++ -I/usr/include/GL -I/usr/include/SDL   -c -o main.o main.cpp
 
et pas
 
g++ -I/usr/include/GL -I/usr/include/SDL -c -Wall -ansi -g main.cpp
 
Est-ce que la solution serait de changer le nom de mon .cpp ou bien est-ce qu'il regarde dans quel fichier est la fonction main()?
J'ai ma réponse :
 
g++ -I/usr/include/GL -I/usr/include/SDL   -c -o debut.o debut.cpp
 
pourquoi? moi je veux mes options -Wall -ansi -g!!!!!!!!!!!!!!!!!!!


Message édité par ptitchep le 02-06-2007 à 12:25:43

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 02-06-2007 à 12:26:03    

Certes, mais lorsqu'on s'amuse à pervertir la sémantique des variables intervenant dans les règles innées on a grand intérêt à ne pas faire intervenir les-dites règles.
Et, que je sache, 'g++    -c -o main.o main.cpp' n'est pas le fruit de vos règles.
 
edit: trop la flemme pour répondre aux edit.

Message cité 1 fois
Message édité par tbp le 02-06-2007 à 12:27:51
Reply

Marsh Posté le 02-06-2007 à 12:29:29    

tbp a écrit :

C
Et, que je sache, 'g++    -c -o main.o main.cpp' n'est pas le fruit de vos règles.


 
Justement je veux m'en débarasser. Comment?
Et si je n'utilise aucune variable "habituelle"?


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 02-06-2007 à 12:45:22    

Dans un makefile, moins on en écrit mieux c'est.
 
La règle

Code :
  1. %.o: %.cpp %.hpp
  2. $(CC) $(CFLAGS) -c -Wall -ansi $(MODE) $<


... ne fait surement pas ce que vous penser qu'elle fait.
 
A ce stade, lire la doc vous ferait certainement gagner du temps http://www.gnu.org/software/make/m [...] Rules.html
 
PS: gcc/g++ peut generer automatiquement les dépendances, genre '-include *.d' dans le makefile et -MMD pour gcc.


Message édité par tbp le 02-06-2007 à 12:45:54
Reply

Marsh Posté le 02-06-2007 à 13:20:17    

Effectivement c'est bien cette règle qui posait problème mais elle est pourtant juste.
En réalité je n'avais pas de main.hpp car je n'ai rien à mettre dedans car ma fonction main se contente de créer un Serveur qui lui gère toute l'application.
 
J'ai donc créé un main.hpp qui contient:
 
#ifndef MAIN_HPP
#define MAIN_HPP
 
#endif
 
et du coup la règle est aussi valide que pour les autres .o et tout fonctionne, même avec mes anciennes variables. En fait make appliquait la règle générique puisque main.hpp n'existait pas
 
Merci beaucoup pour le temps passé et la doc qui m'a l'air plus intéressante que "man make"


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 02-06-2007 à 13:43:37    

Mais merde, j'ai réussi à faire lire une doc?
 
Virez votre règle '%.o: %.cpp %.hpp', elle ne sert à rien vu vos dépendances explicites. En fait, dans votre cas, vous n'avez besoin que d'une règle de linkage puisque qu'il n'y a pas de relation entre la cible (de linkage) et les objets; ensuite avec les règles implicites qui vont biens, un petit 'CXXFLAGS += -Wp,-MT,$@,-MMD,$(@:.o=.d)' et un '-include *.d' à la fin le tout est emballé en qques lignes.
Il est aussi très simple de fabriquer la liste des sources, et celle dérivée des objets, pour peu que les fichiers soient posés comme il faut avec $(wildcard ...), $(patsubst ...) etc...
 
J'me répète mais le truc c'est d'en écrire le moins possible.

Reply

Marsh Posté le 02-06-2007 à 14:03:09    

non je l'ai encore pas lue.
J'ai choisi la solution facile pour que ça fonctionne et la prochaine fois que je bosse sur mon projet je vais m'y atteler et changer mes règles


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 02-06-2007 à 14:12:44    

*ouvre la fenêtre*
*saute*

Reply

Marsh Posté le 02-06-2007 à 14:12:44   

Reply

Marsh Posté le 02-06-2007 à 14:15:01    

pk? y'a un problème avec les gens qui ne veulent pas bosser un samedi?
Je ne fais pas non plus partie de la france qui se lève tot.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 02-06-2007 à 14:26:27    

Aha! encore un de ces traitres à la Nation de traine-la-grolle trotskiste! Tu es fait comme un rat, sors sur ton palier, mets les mains contre le mur et attends le prochain panier à salade.

Reply

Marsh Posté le 02-06-2007 à 14:34:10    

Je peux fumer un joint et chanter des chansons hippies en les attendant?


---------------
deluser --remove-home ptitchep
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed