J'ai eu des erreurs de compilateur / lieur et je ne sais pas quelle est la méthode correcte pour continuer. Je suis dans cette situation: p>
Maintenant, si je déclare FOO1 et FOO2 dans a.h et b.h comme vide externe Void, j'ai eu l'erreur suivante: p>
prj / src / b.o: en fonction
foo1 ': (.Text + 0x0): Définition multiple de code> FOO1 ' prj / src / main.o :(. Texte + 0x0): Défini d'abord ici faire: * em> [Kernel] Erreur 1 P> blockQuote>
Quelle est la façon qui permet de compiler et de relier sans erreur / avertissement dans la situation que j'ai décrite? P>
4 Réponses :
mettre les définitions Par exemple: p> inline code> dans votre fichier
.h code> fichier et dans le fichier
.c code> Les fichiers forcent une définition externe.
Avec statique en ligne (dans les fichiers d'en-tête), cela fonctionne ... mais je n'ai pas compris pourquoi. Pouvez-vous m'expliquer pourquoi cela fonctionne?
Ce code n'utilise pas statique en ligne code> uniquement
en ligne code>.
Je l'ai essayé et je n'ai pas eu d'erreurs
ah p> bh p> Main. CPP p>
de http://gcc.gnu.org/onlinedocs/gcc/inline.html : p>
Lorsqu'une fonction en ligne n'est pas statique, le compilateur doit supposer qu'il peut y avoir des appels d'autres fichiers source; depuis un symbole global peut être défini qu'une seule fois dans n'importe quel programme, la fonction ne doit pas être défini dans les autres fichiers source, les appels ne peuvent pas être intégré. Par conséquent, une fonction intégrée non statique est toujours compilée seul à la mode habituelle. P> blockQuote>
En d'autres termes, sans
statique code>, il émet un symbole pour votre fonction inline. Si vous vous trouvez définir em> cette fonction dans un en-tête et l'inclure dans plusieurs unités de compilation, vous vous retrouvez avec plusieurs symboles (redéfinis). Si vous souhaitez inclure la définition dans l'en-tête, vous devez le faire
statique code>. P>
Vous pouvez envisager d'utiliser des gardes d'en-tête pour éviter la redéfinition. La mise en œuvre des fichiers est la suivante. J'ai essayé la compilation pour les fichiers suivants à l'aide de CMAKE et cela fonctionnait sans problème.
ah code> p>
BH code> p>
main.cpp code> p>
Qu'en est-il d'utiliser
statique en ligne code>?
Je pense que cela ne fonctionnera pas. L'attribut statique signifie que la fonction est visible que dans l'unité de traduction où est déclarée / définie et je souhaite utiliser ces fonctions dans d'autres modules ...
Non attends. Avec statique ça marche ... mais pourquoi? @ 75inchpianiste
Lorsque vous
#include code> un fichier, tout son contenu fait partie de l'unité de traduction actuelle.
en double possible de (ou Définition multiple de la fonction en ligne ou ...)