Forcer la vérification des "include"

Signaler
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
-
Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
-
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

Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
(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]
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
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
Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
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]