wake-up-neo.com

Undefinierter Verweis auf globale Variable während der Verknüpfung

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 Funktion main(), die Funktionen in a.c und b.c aufruft. Darüber hinaus ruft eine Funktion in a.c eine Funktion in b.c und viceversa auf. Schließlich gibt es noch eine globale Variable count, die von den drei Modulen verwendet wird und in einer separaten Header-Datei global.h definiert ist.

Der Code der Quelldateien ist folgender:

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 meinen Fehler reproduziert:

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 und z.o fine kompilieren, aber beim Verknüpfen mit make z 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 habe es geschafft, den Fehler in meinem tatsächlichen Code in diesem minimalen Beispiel zu reproduzieren. Ich denke, es gibt ein Problem in den Abhängigkeiten zwischen Modulen, aber ich kann es nicht erkennen. Kann mir jemand die richtige Richtung zeigen?

14
freieschaf

Ändern Sie Ihren z.c in

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

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

Von global.h erben alle Ihre Dateien die Deklaration der Variablen count, aber die definition fehlt in allen Dateien.

Sie müssen die Definition einer der Dateien als int count = some_value; hinzufügen.

15
Mohit Jain

Sie haben deklariert count, nicht definiert es.

extern ist Teil der Deklaration und keine Definition.

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

Sie müssen definierenint count irgendwo in Ihren Quelldateien.

6
Sourav Ghosh

Sie müssen int count; zu Ihrer zc-Datei hinzufügen ..__, da eine Variable in der Header-Datei als extern deklariert wird, und sagt dem Compiler, dass die Variable in einer anderen Datei deklariert wird. Die Variable ist jedoch noch nicht deklariert und wird aufgelöst. B Linker.

Dann müssen Sie die Variable irgendwo deklarieren. 

1
LPs