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?
Kann "int count" innerhalb der Hauptfunktion sein? – Taozi
@Taoozi Nein, es wird die Zählung eine lokale Variable machen. Wir brauchen eine globale Definition. –