Estoy tratando de compilar un programa que se divide en 3 módulos, correspondientes a 3 archivos de origen: a.c, b.c, y z.c. z.c contiene el main() función, que llama a funciones en a.c y b.c. Además, una función en a.c llama a una función en b.c, y viceversa. Por último, hay una variable global count que es utilizado por los tres módulos y se define en un archivo de cabecera aparte, global.h.

El código de los archivos de origen es la siguiente:

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

Los archivos de encabezado:

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

Y, finalmente, la makefile que reproduce mi error:

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 esto, puedo compilar los objetos a.o, b.o, y z.o bien, pero, cuando la vinculación con make z, tengo undefined reference to 'count' en todos ellos:

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

He conseguido reproducir el error en mi código real en este ejemplo mínimo, así que supongo que hay un problema en las dependencias entre los módulos, pero no puedo irregular. Puede alguien me apunte en la dirección correcta?

OriginalEl autor freieschaf | 2015-01-22

3 Comentarios

  1. 15

    Cambiar su z.c a

    #include "a.h"
    #include "b.h"
    #include "global.h"
    
    int count; /* Definition here */
    int main() {
        count = 0;
        functAb();
        functBa();
        return 0;
    }

    De global.h, todos sus archivos heredan la declaración de la variable count pero la definición falta de todos los archivos.

    Debe agregar la definición de uno de los archivos como int count = some_value;

    Puede «int count» estar dentro de la función main?
    No, esto hará que el count una variable local. Necesitamos una definición global.

    OriginalEl autor Mohit Jain

  2. 6

    Tiene declarado cuentan, no definido.

    extern es una parte de la declaración, no una definición.

    Ser explícito, extern es una clase de almacenamiento especificador y se utiliza en la declaración.

    Necesita definir int count en algún lugar de los archivos de origen.

    OriginalEl autor Sourav Ghosh

  3. 1

    Tienes que añadir int count; a su z.c archivo.
    Esto a causa de la declaración de una variable en el archivo de encabezado como extern le dice al compilador que la variable será declarado en otro archivo, pero la variable no declarada todavía y será resuelto b enlazador.

    Entonces usted necesita para declarar la variable en algún lugar.

    OriginalEl autor LPs

Dejar respuesta

Please enter your comment!
Please enter your name here