2017-07-27 2 views
-1

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?

+0

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

+0

Je n'ai pas pu poster le code exact car il est peu confidentiel. Y at-il autre chose que je puisse faire ? – Prz9

+0

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'. –

Répondre

4

Vous devez vous assurer que la variable person n'est définie qu'une seule fois. Pour ce faire, vous devez seulement déclarer que variable foo.h:

extern human *person; 

Puis, en foo.cpp, vous le définir:

human *person = NULL; 

Vous indiquez ensuite foo.o dans les fichiers objets qui composent game.so.

+0

Laissez-moi essayer ceci Nikos. – Prz9

+0

Cela a fonctionné sur Nikos. Merci beaucoup pour l'aide :) – Prz9

1

Vous semblez confondre DÉCLARATION avec DÉFINITION. Votre en-tête doit DÉCLARER la structure, votre C/C++ utilisera ensuite une telle déclaration pour définir des variables ou se référer à des instances de telles définitions.

+0

Non Ron. Suis clair avec DÉFINITION et DÉCLARATION. Les définitions de structure peuvent être dans l'en-tête et ne doivent pas créer plusieurs erreurs de définition, comme indiqué par M.M. Je vais très bien avec votre point que les définitions ne devraient pas être dans les en-têtes et c'est pourquoi j'ai mentionné que je suis incapable de supprimer les définitions de l'en-tête en raison de certaines dépendances. – Prz9

+0

Votre question révisée montre que vous dupliquez réellement la définition VARIABLE (humain). La variable humaine doit être définie une seule fois. Les références à cela devraient utiliser extern pour éviter la redondance. Pourquoi la définition de la variable (c'est-à-dire l'affectation) a-t-elle lieu dans un en-tête et non dans le module qui devrait "posséder" la variable? Si/quand une variable est définie dans un en-tête, elle devrait normalement être protégée avec un #ifdef _FROM_DEFINE_MODULE (définition) #else (déclaration externe) #endif –

+0

Ouais ok Ron. Merci pour l'aide :) – Prz9