Fondamentalement mon prob est la suivante:multiples erreur de définition tout en liant deux fichiers objet avec la même définition
J'ai un fichier d'en-tête - foo.h
avec un pointeur de la structure human *person = NULL
en elle. La définition de la structure human
se trouve dans un autre en-tête inclus dans foo.h. Je crée un fichier objet partagé game.so
en utilisant foo.h
et quelques autres en-têtes et cpps.
Maintenant, j'ai deux fichiers cpp différents - a.cpp
et b.cpp
qui incluent l'en-tête foo.h. Je crée séparément un fichier objet a.o
et b.o
séparément. Je lie à la fois le fichier objet et game.so
pour créer un autre fichier objet partagé tennis.so
et, ce faisant, je reçois plusieurs définitions pour la "personne". Je suis conscient que l'erreur de définition multiple est parce que a.o
contient la définition de structure pour person
, ainsi que b.o
. J'ai déjà utilisé #pragma once
en foo.h
déjà. a.o
est compilé séparément et b.o
est compilé séparément. donc je ne pense pas que #pragma une ou ifdef sera utile ici parce que les deux a.cpp
et b.cpp
comprend foo.h
Je ne peux pas changer la structure défintion en foo.
h à tout autre fichier cpp en raison de certaines dépendances, tout en créant game.so
Est il existe un autre moyen de résoudre l'erreur de définition multiple que je reçois lors de la création tennis.so
?
Il n'existe pas d'erreur de lien de définition multiple pour une structure. S'il vous plaît poster le code exact et construire des commandes pour reproduire la situation, plus la sortie exacte du compilateur. –
Je n'ai pas pu poster le code exact car il est peu confidentiel. Y at-il autre chose que je puisse faire ? – Prz9
Vous pouvez créer un MCVE ([MCVE]). Cela reproduira le problème mais ne contiendra rien de confidentiel. Il semble que votre en-tête ne déclare pas la variable; il définit la variable. Par conséquent, chaque fichier contenant l'en-tête contient une définition, ce qui empêche leur liaison. Règle simple: les variables déclarées dans les en-têtes doivent être déclarées avec le mot clé 'extern'. –