Makefile: défintions multiples

Makefile: défintions multiples

by Arnault Dominic Philippe Stähli -
Number of replies: 2

Bonjour, 

J'ai un problème avec des messages d'erreurs dont je ne comprends pas l'origine. Ce problème est lié au Makefile. Lorsque je "construis" chaque fichier .o, tout se déroule sans problème. Mais lorsque je souhaite créer un fichier executable où je liste tous les fichiers .o dont j'ai besoin, le compilateur m'affiche que je définis plusieurs fois toutes les méthodes du code qui sont appelées et qui appartiennent exclusivement à la classe "Vecteur". 

J'ai vérifié que #pragma once soit inclut dans chaque fichier .h. Je ne comprends donc pas l'orgine de l'erreur. Pourriez-vous m'aider?

J'ai d'éventuelles questions liées dont leur réponse pourrait m'être utile:

1. Que se passe-t-il si je liste plus de .o dans l'executable que j'en ai en réalité besoin?

2. Que se passe-t-il si j'inclus des .h (par exemple #include "vecteur.h") dans certains de mes fichiers alors que je ne les liste pas dans le Makefile lorsque je "construis" les fichiers .o de ces mêmes fichiers(par exemple contenu.o: contenu.cc vecteur.h)? 

Merci beaucoup

In reply to Arnault Dominic Philippe Stähli

Re: Makefile: défintions multiples

by Deleted user -

Pour ton problème, vérifie que dans les fichiers objets que tu vas utiliser, tu n'as pas inclus des .cc en doublons. Ce n'est à mon avis pas dû à des include, le compilateur t'aurais averti avant... Par exemple,

targetA.o : A.cc A.h
targetB.o : B.cc A.cc B.h
target: targetA.o targetB.o

Vérifies aussi si tu n'as pas mis des .o dans des targets créant des .o.

Pour tes questions:

1. Bonne question ça. Je ne suis pas entièrement sûr, et cela dépendra sûrement du compilateur. Il se peut tout à fait que le code "excessif" que tu donnes au linker reste dans ton excécutable, comme semble le montrer ce post d'un blog. Une petite recherche sur le flag "-ffunction-sections" qui y est mentionné m'amène ici. Il semblerait qu'en combinant ce flag à "-Wl,--gc-sections", gcc puisse se débarrasser du code inutile. Si j'étais toi, cependant, je n'utiliserais pas ces fonctionnalités à moins d'avoir des exécutables énormes et bourrés de fonctions inutiles. Comme d'habitude, il vaut mieux s'occuper de ce genre de choses seulement si elles causent des problèmes.

2. Si tu ne listes pas un header (A.h) dont a besoin un certain B.o, tu n'auras normalement pas d'erreur (le compilateur va quand même voir et faire l'include). Par contre, si tu modifies A.h et que tu ne touches pas au reste du code, en appelant "make", il est possible que B.o ne soit pas recompilé (parce que tu n'as pas indiqué A.h comme une dépendance explicite de B.o).

In reply to Arnault Dominic Philippe Stähli

Makefile: défintions multiples

by Arnault Dominic Philippe Stähli -
Je te remercie beaucoup pour ta réponse rapide. Tu as répondu très précisément à mes questions. Ça me sera très utile par la suite.
Bonne fin de journée.