2010-11-08 8 views
16

Cuando traté de compilar este programa, que fracasaron:¿Por qué obtengo errores de "referencia indefinida" incluso cuando incluyo los archivos de encabezado correctos?

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <unistd.h> 

void *WriteNumbers(void *threadArg) 
{ 
    int start, stop; 

    start = atoi((char *)threadArg); 
    stop = start + 10; 

    while (start < stop) 
    { 
     printf("%d\n", start++); 
     sleep(1); 
    } 
    return 0; 
} 

int main(int argc, char **argv) 
{ 
     pthread_t thread1, thread2; 

     // create the threads and start the printing 
     pthread_create(&thread1, NULL, WriteNumbers, (void *)argv[1]); 
     pthread_create(&thread2, NULL, WriteNumbers, (void *)argv[2]); 

     pthread_join(thread1, NULL); 
     pthread_join(thread2, NULL); 

     return 0; 
} 

Me dio los siguientes errores:

tmp/ccrW21s7.o: In function `main': 
pthread.c:(.text+0x83): undefined reference to `pthread_create' 
pthread.c:(.text+0xaa): undefined reference to `pthread_create' 
pthread.c:(.text+0xbd): undefined reference to `pthread_join' 
pthread.c:(.text+0xd0): undefined reference to `pthread_join' 
collect2: ld returned 1 exit status 

¿Por qué me dan estos errores de referencia a pesar de que yo había incluido pthread.h, que declara estas funciones?

+1

También tiene otros problemas: no está comprobando el valor de 'argc' pero está utilizando los valores de' argv'. Su método 'WriteNumbers' no devuelve un valor. – dreamlax

+0

@dreamlax: he solucionado el problema de "no devolución"; No noté el problema argc/argv. –

Respuesta

23

Es probable que haya olvidado vincular con la biblioteca Pthreads (usando -lpthread en la línea de comandos).

+8

He agregado esto a la etiqueta wiki como una pregunta frecuente. Esta pregunta se hace al comienzo de cada semestre de otoño :) –

+1

@ cold-blooded ¿Por qué no has aceptado esto como la respuesta? – Mawg

3

es necesario enlazar pthread biblioteca para su binario, como esto:

cc -o myapp myapp.c -lpthread 
21

Otros han mencionado que no se ha vinculado con la biblioteca pthread usando la bandera -lpthread. Modern GCC (no estoy seguro de qué tan moderno, el mío es 4.3.3) le permite usar solo -pthread. Desde la página del manual:

-pthread
añade soporte para múltiples hilos con la biblioteca pthreads. Esta opción establece indicadores tanto para el preprocesador como para el enlazador.

+0

En realidad, es el "viejo" gcc que permite eso. El -pthread es una sintaxis muy antigua, y solo se proporciona para la compatibilidad con compiladores antiguos que no tienen -l soporte ... –

+1

@WouterVerhelst No creo que sea cierto. '-pthread' sigue siendo la marca recomendada, ya que también establece los indicadores de compilación y preprocesador requeridos, mientras que' -lpthread' solo dirige al enlazador para que enlace con libpthread. –

1

Haz

gcc -pthread -o name filename.c (cpp) 

para compilar el programa, entonces

./name 

para ejecutar el programa.

Cuestiones relacionadas