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?
"int count" può essere all'interno della funzione principale? – Taozi
@Taozi No, renderà il 'count' una variabile locale. Abbiamo bisogno di una definizione globale. –