2009-11-11 6 views
2

Je suis en train de compiler un programme c qui inclut un en-tête dans des fichiers .c. mais seulement 1 des fichiers .c utilise réellement la variable définie dans le fichier d'en-tête. Voici un exemple de code qui générera le problème de l'éditeur de liens. J'essaie d'avoir mon fichier d'en-tête contenant des variables globales qui sont utilisées par 2 différents fichiers .c ... Tout type d'aide serait apprécié. Merci.Problèmes de lieur linux gcc avec le programme C

fichier tmp1.h

#ifndef TMP1_H_1 
#define TMP1_H_1 

double xxx[3] = {1.0,2.0,3.0}; 

#endif 

fichier tmp1.c

#include "tmp1.h" 

void testing() 
{ 
    int x = 0; 
    x++; 
    xxx[1] = 8.0; 
} 

fichier main1.c

#include <stdio.h> 
#include "tmp1.h" 

int main() 
{ 
printf("hello world\n"); 
} 
+0

Généralement, c'est une bonne idée d'inclure dans la question quelle erreur vous obtenez réellement. – sth

+2

Ce serait le tristement célèbre "C1234: Ne pas définir les données dans vos fichiers d'en-tête, ya oie" message d'erreur :-) – paxdiablo

Répondre

5

Le problème que vous êtes est une variable dans initialise un fichier d'en-tête , donc vous obtenez des symboles en double. Vous devez déclarer double xxx avec le mot-clé extern, puis l'initialiser dans un fichier .c.

comme ceci:

#ifndef TMP1_H_1 
#define TMP1_H_1 

extern double xxx[3]; 

#endif 

Et puis dans l'un des fichiers .c:

double xxx[3] = {1.0,2.0,3.0}; 
+0

+1, mais je tiens à souligner qu'il n'y a pas besoin de l'extern du tout si " seulement 1 des fichiers .c utilise vraiment la variable définie "- juste déclarer, définir et utiliser dans ce fichier c. – paxdiablo

+0

True. En fait, en supposant que le code réel du PO n'est pas plus compliqué que ce qui a été posté, il n'est pas nécessaire que le second fichier .c inclue même le fichier d'en-tête. –

1

Ne pas mettre le code dans les fichiers d'en-tête, il est une recette pour "symbole multiplier défini" erreurs de l'éditeur de liens. Mettez une référence extern à votre variable globale dans le fichier d'en-tête, puis définissez le global réel dans l'un de vos fichiers C (ou même un nouveau fichier).

0

Mettez extern pour xxx et définissez xxx dans un fichier .c.

Questions connexes