Forcer la vérification des "include"

sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 - 12 janv. 2010 à 11:24
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 12 janv. 2010 à 15:53
Bonjour,

Une petite question sur le compilateur g++.

J'ai une classe (dans un couple .cc et .h) qui utilise un tableau de taille 100 défini dans le fichier header. J'ai ensuite un main.cc pour tester cette classe. Dans ce main.cc, on trouve un "include<maclasse.h>".
Je fais un "make", et je récupère donc, en plus de l'exécutable, un main.o et et un "maclasse.o". Or si je modifie la taille du tableau dans le "maclasse.h" (je la passe à 1000), le make ne recompile pas le "main.o", ce qui donne une erreur de segmentation (le main conserve le tableau à 100).
D'où ma question :
Existe-t-il un paramètre de g++ pour forcer la vérification des inclusions et recompiler le .cc si besoin ? (là, ça va parce que je n'ai que deux fichiers...)

Simon

3 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
12 janv. 2010 à 11:36
(dans un couple .cc et .h)

En C++, on utilise .cc/.hh ou .cpp/.hpp, le .h étant réservé au C.

include<maclasse.h>

J'aurais plutôt utilisé #include "maclasse.h".

Existe-t-il un paramètre de g++ pour forcer la vérification des inclusions et recompiler le .cc si besoin ? (là, ça va parce que je n'ai que deux fichiers...)

Pour g++: non. Dans le Makefile: oui ! Et heureusement. Tu as une option dans g++, appelé -MM qui génère une liste de dépendance pour ton makefile :)
Regarde le makefile d'un de mes projets:
http://www.cppfrance.com/codes/COMPILATEUR-PSEUDO-PASCAL_49318.aspx

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
12 janv. 2010 à 15:39
Merci pour tes réponses.
concernant les extensions, je suis les consignes de mes profs, désolé... maintenant, si tu me dis que c'est ce qui se fait, je corrigerai.

include<maclasse.h> car j'ai fait une arborescence avec les sources dans "src", les includes dans "include" et un -I à la compilation.

J'ai regardé ton source, malheureusement, je n'ai pas tout compris, n'ayant jamais rencontré de fichiers configure ou makefile.deps. Aurais-tu un petit tuto à me proposer ?
Question subsidiaire : qu'est-ce que le makefile.rules ?

merci pour ton aide,

Simon
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
12 janv. 2010 à 15:53
include<maclasse.h> car j'ai fait une arborescence avec les sources dans "src", les includes dans "include" et un -I à la compilation.

Je n'avais pas le contexte. C'est dans ce cas tout à fait correcte.

J'ai regardé ton source, malheureusement, je n'ai pas tout compris, n'ayant jamais rencontré de fichiers configure ou makefile.deps. Aurais-tu un petit tuto à me proposer ?

Ok, alors pour t'expliquer brievement:

Soit le fichier toto.cc qui dépend de plusieurs fichiers .hh (ou .h), si tu tapes:
g++ -MM toto.cc

Il te réponds:
toto.o: toto.cc toto.hh truc.hh

Ce qui est exactement le format d'une règle de Makefile ! (Ce n'est pas un hasard :p).
Donc tu fais ton Makefile, comme d'habitude, et tu ajoutes l'ensemble

Question subsidiaire : qu'est-ce que le makefile.rules ?

C'est un fichier créer par le configure, et qui est inclut par le Makefile. Ca permet d'inclure une série de variables, de manière dynamique. Si tu n'as pas de configure, alors tu as forcément des variables au début de ton fichier Makefile.

makefile.deps

Ce type de fichier est construit à chaque compilation. On stocke dedans l'ensemble des dépendances (notamment les headers) obtenues par -MM, que l'on inclut directement dans le Makefile, car le format généré est compatible (voir explication du -MM).

Si tu ne veux pas te faire chier, tu peux aussi ajouter les headers en dépendances des .o associés, ça fonctionnera. Mais c'est moins robuste que cette technique, qui génère ceci pour toi.

Dans le projet que je t'ai filé, regarde:
- configure
- Makefile
- src/Makefile

C'est très générique, puisqu'il ne faut modifier que la liste des .cc et .hh du src/Makefile, quelque soit le projet (Tu devras juste ajouter un -I pour ton cas).

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
Rejoignez-nous