2015-01-22 6 views
12

Ich versuche ein Programm zu kompilieren, das in 3 Module unterteilt ist, die 3 Quelldateien entsprechen: a.c, b.c und z.c. z.c enthält die main()-Funktion, die Funktionen in a.c und b.c aufruft. Außerdem ruft eine Funktion in a.c eine Funktion in b.c auf, und umgekehrt. Schließlich gibt es eine globale Variable count, die von den drei Modulen verwendet wird und in einer separaten Header-Datei definiert ist, global.h.Undefinierter Verweis auf globale Variable während der Verknüpfung

Der Code der Quelldateien ist die folgende:

a.c

#include "global.h" 
#include "b.h" 
#include "a.h" 

int functAb() { 
    functB(); 
    functA(); 
    return 0; 
} 

int functA() { 
    count++; 
    printf("A:%d\n", count); 
    return 0; 
} 

b.c

#include "global.h" 
#include "a.h" 
#include "b.h" 

int functBa() { 
    functA(); 
    functB(); 
    return 0; 
} 

int functB() { 
    count++; 
    printf("B:%d\n", count); 
    return 0; 
} 

z.c

#include "a.h" 
#include "b.h" 
#include "global.h" 

int main() { 
    count = 0; 
    functAb(); 
    functBa(); 
    return 0; 
} 

Die Header-Dateien:

a.h

#ifndef A_H 
#define A_H 

#include <stdio.h> 

int functA(); 
int functAb(); 

#endif 

b.h

#ifndef B_H 
#define B_H 

#include <stdio.h> 

int functB(); 
int functBa(); 

#endif 

global.h

#ifndef GLOBAL_H 
#define GLOBAL_H 

extern int count; 

#endif 

Und schließlich die makefile, die reproduziert mein Fehler:

CC = gcc 
CFLAGS = -O3 -march=native -Wall -Wno-unused-result 

z: a.o b.o z.o global.h 
    $(CC) -o z a.o b.o z.o $(CFLAGS) 
a.o: a.c b.h global.h 
    $(CC) -c a.c $(CFLAGS) 
b.o: b.c a.h global.h 
    $(CC) -c b.c $(CFLAGS) 
z.o: z.c a.h global.h 
    $(CC) -c z.c $(CFLAGS) 

Damit kann ich die Objekte a.o, b.o, kompilieren und z.o in Ordnung, aber, wenn sie mit make z verbindet, bekomme ich undefined reference to 'count' in allen von ihnen:

z.o: In function `main': 
z.c:(.text.startup+0x8): undefined reference to `count' 
a.o: In function `functAb': 
a.c:(.text+0xd): undefined reference to `count' 
a.c:(.text+0x22): undefined reference to `count' 
a.o: In function `functA': 
a.c:(.text+0x46): undefined reference to `count' 
a.c:(.text+0x5b): undefined reference to `count' 
b.o:b.c:(.text+0xd): more undefined references to `count' follow 
collect2: ld returned 1 exit status 

ich es geschafft, den Fehler zu reproduzieren in meinem tatsächlichen Code in diesem minimalen Beispiel, so denke ich, gibt es ein Problem in den Abhängigkeiten zwischen Modulen, aber ich kann es nicht erkennen. Kann mir jemand in die richtige Richtung zeigen?

Antwort

13

ändern z.c zu

#include "a.h" 
#include "b.h" 
#include "global.h" 

int count; /* Definition here */ 
int main() { 
    count = 0; 
    functAb(); 
    functBa(); 
    return 0; 
} 

Von global.h, alle Dateien, die Erklärung variabler count aber die Definition fehlt von allen Dateien erben.

Sie müssen die Definition einer der Datei als int count = some_value;

+0

Kann "int count" innerhalb der Hauptfunktion sein? – Taozi

+1

@Taoozi Nein, es wird die Zählung eine lokale Variable machen. Wir brauchen eine globale Definition. –

6

hinzufügen Sie haben Zahl erklärt, nicht definiert.

extern ist ein Teil der Deklaration, keine Definition.

Um explizit zu sein, ist extern ein Speicherklassenspezifizierer und wird bei der Deklaration verwendet.

Sie müssen definierenint count irgendwo in Ihren Quelldateien.

1

Sie müssen int count; zu Ihrer z.c-Datei hinzufügen. Dies geschieht, weil eine Variable in der Headerdatei als extern dem Compiler deklariert, dass die Variable in einer anderen Datei deklariert wird, aber die Variable noch nicht deklariert ist und b Linker aufgelöst wird.

Dann müssen Sie die Variable irgendwo deklarieren.

Verwandte Themen