Referencia indefinida a pthread_create en Linux
Obtuve la siguiente demostración de la web en https://computing.llnl.gov/tutorials/pthreads/
#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS 5
void *PrintHello(void *threadid)
{
long tid;
tid = (long)threadid;
printf("Hello World! It's me, thread #%ld!\n", tid);
pthread_exit(NULL);
}
int main (int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc;
long t;
for(t=0; t<NUM_THREADS; t++){
printf("In main: creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
pthread_exit(NULL);
}
Pero cuando lo compilo en mi máquina (ejecutando Ubuntu Linux 9.04) aparece el siguiente error:
corey@ubuntu:~/demo$ gcc -o term term.c
term.c: In function ‘main’:
term.c:23: warning: incompatible implicit declaration of built-in function ‘exit’
/tmp/cc8BMzwx.o: In function `main':
term.c:(.text+0x82): undefined reference to `pthread_create'
collect2: ld returned 1 exit status
Esto no tiene ningún sentido para mí, porque el encabezado incluye pthread.h
, que debería tener la pthread_create
función. ¿Alguna idea de qué está yendo mal?
Aceptado
Para Linux el comando correcto es:
gcc -pthread -o term term.c
En general, las bibliotecas deben seguir las fuentes y los objetos en la línea de comandos, y -lpthread
no es una "opción", es una especificación de la biblioteca. En un sistema que solo tiene libpthread.a
instalado,
gcc -lpthread ...
no podrá vincularse.
Lea esta o esta explicación detallada.
Para Linux el comando correcto es:
gcc -o term term.c -lpthread
- tienes que poner -lpthread justo después del comando de compilación, este comando le indicará al compilador que ejecute el programa con la biblioteca pthread.h.
- gcc -l enlaza con un archivo de biblioteca. Enlace -l con el nombre de la biblioteca sin el prefijo lib.