8
votes

Erreur de liaison Fonction en ligne

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:

  • A.H: Dans ce fichier est défini une fonction déclarée «Inline», par exemple: Inline Void FOO1 ();
  • b.h: dans ce fichier est défini une fonction déclarée «Inline» qui appelle FOO1 (): Inline Void FOO2 ();
  • Main.c: Certaines fonctions appelle à la fois FOO1 et FOO2 ().

    Maintenant, si je déclare FOO1 et FOO2 dans a.h et b.h comme vide externe Void, j'ai eu l'erreur suivante:

    prj / src / b.o: en fonction foo1 ': (.Text + 0x0): Définition multiple de FOO1 ' prj / src / main.o :(. Texte + 0x0): Défini d'abord ici faire: * [Kernel] Erreur 1

    Quelle est la façon qui permet de compiler et de relier sans erreur / avertissement dans la situation que j'ai décrite?


5 commentaires

Qu'en est-il d'utiliser statique en ligne ?


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 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 ...)


4 Réponses :


0
votes

mettre les définitions inline dans votre fichier .h fichier et dans le fichier .c Les fichiers forcent une définition externe.

Par exemple: xxx


2 commentaires

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 uniquement en ligne .



0
votes

Je l'ai essayé et je n'ai pas eu d'erreurs

ah xxx

bh xxx

Main. CPP xxx


0 commentaires

20
votes

de http://gcc.gnu.org/onlinedocs/gcc/inline.html :

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.

En d'autres termes, sans statique , il émet un symbole pour votre fonction inline. Si vous vous trouvez définir 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 .


0 commentaires

0
votes

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 xxx

BH xxx

main.cpp xxx


0 commentaires