2011-05-05 27 views
15

Tengo 2 archivos: a.c y b.c¿Qué significa la "referencia indefinida a varName" en C?

En a.c estoy enviando una señal a una función situada en b.c

signal(SIGUSR1,doSomething); 

En la parte superior del archivo de corriente alterna, tengo:

extern void doSomething (int sig); 

Cuando compilo, sin embargo, me sale un error:

/tmp/ccCw9Yun.o: In function main':
a.c:(.text+0xba): undefined reference to
doSomething'
collect2: ld returned 1 exit status

Los siguientes encabezados se incluyen:

#include <stdlib.h> 
#include <stdio.h> 
#include <signal.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

¿cómo puedo solucionar esto?

+0

Por favor, muestre sus archivos de encabezado ('.h'). –

+3

Este es un error de enlazador –

+0

¿Está realmente definido 'doSomething' en' b.c'? – Borealid

Respuesta

17

Es necesario vincular tanto a.o y b.o:

gcc -o program a.c b.c 

Si usted tiene un main() en cada archivo, no se puede unirlos.

Sin embargo, su archivo a.c contiene una referencia a doSomething() y espera estar vinculado con un archivo de fuente que define doSomething() y no define ninguna función que se define en a.c (como main()).

No se puede llamar a una función en el Proceso B Proceso de A. No se puede enviar una señal a una función; envía señales a los procesos, utilizando la llamada al sistema kill().

La función signal() especifica qué función en el proceso actual (programa) se va a manejar la señal cuando el proceso recibe la señal.

Usted tiene un trabajo serio que hacer entender cómo se va a trabajar - cómo programą va a saber qué ID de proceso para enviar la señal a. El código en b.c va a necesitar llamar al signal() con dosomething como manejador de señal. El código en a.c simplemente enviará la señal al otro proceso.

+0

Lo que pasa es que ... a.c y b.c definen cada función principal propia. La compilación de archivos .o da como resultado un error de definición múltiple de 'main' – JAM

+0

@mac. Bueno, necesita vincularlos si va a depender de funciones en el otro; si tienen funciones duplicadas, necesitas resolverlo de alguna manera (tal vez sacar 'doSomething' en un tercer archivo del que' a.c' y 'b.c' dependen ambos) –

+0

Lo tengo. En lugar de usar signal() ... usé kill (pid_to_send_signal_to, handler); – JAM

3

usted está recibiendo un error de vinculador, por lo que su extern está trabajando (el compilador compila a.c sin ningún problema), pero cuando se fue a vincular archivos objeto juntos al final no pudo resolver su extern - void doSomething(int); en realidad no se encontró en ningún lado. ¿Has estropeado el exterior? Asegúrate de que haya realmente una doSomething se define en b.c que toma un int y devuelve void, y asegúrese de que se acordó de incluir b.c en su lista de archivos (es decir, que estás haciendo algo así como gcc a.c b.c, no sólo gcc a.c)

3

necesita compilar y vincular los ficheros objeto de esta manera:

gcc -c a.c 
gcc -c b.c 
gcc a.o b.o -o prog 
4

Una reacción inicial a esta habría que preguntar y asegurarse de que los dos archivos de objetos están siendo unidos entre sí.Esto se realiza en la etapa de compilación mediante la compilación de los dos archivos al mismo tiempo:

gcc -o programName a.c b.c 

O si se quiere compilar por separado, sería:

gcc -c a.c 
gcc -c b.c 
gcc -o programName a.o b.o 
10

Es muy mal estilo para definir externa interfaces en archivos .c .

usted debe hacer esto

a.h

extern void doSomething (int sig); 

A.C.

void doSomething (int sig) 
    { 
     ... do stuff 
    } 

b.c

#include "a.h" 
..... 
signal(SIGNAL, doSomething); 

.

1

asegúrate de que tu función doSomething no sea estática.