Problème de Makefile [Résolu] - C++ - Programmation
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++.
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!!!!!!!!!!!!!!!!!!!
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.
Marsh Posté le 02-06-2007 à 12:29:29
tbp a écrit : C |
Justement je veux m'en débarasser. Comment?
Et si je n'utilise aucune variable "habituelle"?
Marsh Posté le 02-06-2007 à 12:45:22
Dans un makefile, moins on en écrit mieux c'est.
La règle
Code :
|
... 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.
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"
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.
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
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.
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.
Marsh Posté le 02-06-2007 à 14:34:10
Je peux fumer un joint et chanter des chansons hippies en les attendant?
Marsh Posté le 01-06-2007 à 04:21:29
Bonjour
voilà mon Makefile:
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