2015-01-22 13 views
12

Sto provando a compilare un programma che è diviso in 3 moduli, corrispondenti a 3 file di origine: a.c, b.c e z.c. z.c contiene la funzione main(), che chiama le funzioni in a.c e b.c. Inoltre, una funzione in a.c chiama una funzione in b.c e viceversa. Infine, esiste una variabile globale count che viene utilizzata dai tre moduli ed è definita in un file di intestazione separato, global.h.Riferimento indefinito alla variabile globale durante il collegamento

Il codice dei file di origine è la seguente:

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; 
} 

I file di intestazione:

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 

E, infine, la makefile che riproduce il mio errore:

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) 

Con questo, posso compilare gli oggetti a.o, b.o e z.o bene, ma, durante il collegamento con make z, ottengo undefined reference to 'count' in tutti loro:

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 

sono riuscito a riprodurre l'errore nel mio codice attuale in questo esempio minimo, quindi suppongo che ci sia un problema nelle dipendenze tra i moduli, ma non riesco a riconoscerlo. Qualcuno può indicarmi la giusta direzione?

risposta

13

Cambia la tua z.c a

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

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

Da global.h, tutti i file ereditano il dichiarazione di di variabili count ma la definizione manca da tutti i file.

è necessario aggiungere la definizione di uno dei file come int count = some_value;

+0

"int count" può essere all'interno della funzione principale? – Taozi

+1

@Taozi No, renderà il 'count' una variabile locale. Abbiamo bisogno di una definizione globale. –

6

Hai dichiarato conteggio, non definito esso.

extern è una parte della dichiarazione, non una definizione.

Per essere esplicito, extern è un identificatore di classe di memoria e utilizzato nella dichiarazione.

È necessario definireint count da qualche parte nei file di origine.

1

È necessario aggiungere int count; al file z.c. Ciò a causa della dichiarazione di una variabile nel file di intestazione come extern indica al compilatore che la variabile verrà dichiarata in un altro file, ma la variabile non è stata ancora dichiarata e verrà risolta b linker.

Quindi è necessario dichiarare la variabile da qualche parte.