Referencia indefinida a pthread_create en Linux

376

Tomé 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) me sale 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_createfunción. Alguna idea de lo que va mal?

Ralph
fuente
66
Además: dependiendo de la plataforma, es posible que tenga (a) un compilador diferente para hilos, (b) un libc diferente para hilos (es decir -lc_r), (c) -threado -threadsu otro, en lugar de o además de -lpthread.
Ephemient el
Justo un poco por encima de ese ejemplo, verá una tabla de los comandos del compilador correctos, ya sea GCC, IBM, etc. 'Empleado ruso' es correcto.
Jonathon Reinhart
8
¿Puede desmarcar mi respuesta, para que pueda eliminarla (y marcar la que es realmente correcta, que es la más votada)?
Pavel Minaev
3
-lpthreades necesario durante la compilación
Cómo Chen
55
soluciónLDFLAGS= -pthread -lpthread
dsnk

Respuestas:

696

Ambas respuestas a esta pregunta hasta ahora son incorrectas .
Para Linux, el comando correcto es:

gcc -pthread -o term term.c

En general, las bibliotecas deben seguir fuentes y objetos en la línea de comandos, y -lpthreadno es una "opción", es una especificación de biblioteca. En un sistema con solo libpthread.ainstalado,

gcc -lpthread ...

no se podrá vincular.

Ruso empleado
fuente
2
+1 esta solución funcionó ... otras no. Además, la sugerencia de que 'las bibliotecas deberían seguir fuentes y objetos' es un gran consejo: una cita o explicación adicional sería excelente.
sholsapp
77
@sholsapp Aquí está la explicación: webpages.charter.net/ppluzhnikov/linker.html
Empleado ruso el
Esto todavía me falló hasta que puse -lpthread al final de mi comando. gcc term.c -lpthread
CornSmith
Acabo de encontrar un problema al compilar snortsam en Ubuntu 14.04 que en realidad tiene libpthread.a y libpthread.so. Estaba recibiendo undefined reference to 'pthread_cancel'y undefined reference to 'pthread_create'errores. Me encontré con esta publicación SO y pensé en probar la respuesta de Employed Russian. Abrí makesnortsam.shen VI y ejecuté el comando :%s/lpthread/pthread/gpara reemplazar lpthread con pthread para que lo use en -pthreadlugar de -lpthreadcuando compila. Entonces pude compilar snortsam. Gracias empleado ruso!
dcarrith
55
Para cualquiera que use CODEBLOCKS: Agregar -pthreada las Opciones de compilación del proyecto -> Configuración del vinculador -> Otras opciones del vinculador.
user3728501
39

en eclipse

propiedades-> c / c ++ Build-> setting-> GCC C ++ linker-> las bibliotecas en la parte superior agregan "pthread"

sam
fuente
El mismo consejo se aplica en code :: project (y creo que otros también IDE)
Fil
19

Ejecutando desde la terminal de Linux, lo que funcionó para mí fue compilar usando el siguiente comando (supongamos que el archivo c que quiero compilar se llama test.c):

gcc -o test test.c -pthread

Espero que ayude a alguien!

Alexander Nenartovich
fuente
19

Para Linux, el comando correcto es:

gcc -o term term.c -lpthread
  1. debe 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.
  2. gcc -l se vincula con un archivo de biblioteca. Link -l con el nombre de la biblioteca sin el prefijo lib.
Gopika BG
fuente
No es una buena idea usar un indicador no estándar cuando existe un indicador estándar que tiene la misma función en su plataforma.
David Schwartz
12

Si está usando cmake, puede usar:

add_compile_options(-pthread)

O

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
Jayhello
fuente
7

Compílelo así: gcc demo.c -o demo -pthread

legagaz
fuente
6

Creo que la forma correcta de añadir pthreaden CMakees con el siguiente

find_package (Threads REQUIRED)

target_link_libraries(helloworld
    ${CMAKE_THREAD_LIBS_INIT}
)
Rufus
fuente
4

En Visual Studio 2019, especifique -pthreaden las páginas de propiedades del proyecto en:

Linker -> Línea de comando -> Opciones adicionales

Escriba en -pthreadel cuadro de texto.

WBuck
fuente
3

Necesita usar la opción -lpthreadcon gcc.

xiaolong
fuente
77
¡información errónea! -lpthreadno es una "opción", especifica una biblioteca.
una opción de línea de comando (en contraste con un argumento de línea de comando)
Alexander Stohr
3

solo necesita Agregar "pthread" en propiedades => C / C ++ build => GCC C ++ Linker => Bibliotecas => parte superior "Bibliotecas (-l)". Eso es

sam
fuente
2

revise la página de manual y obtendrá.

Compilar y vincular con -pthread.

SYNOPSIS
       #include <pthread.h>

       int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);


       Compile and link with -pthread.
       ....
Kalu Wang
fuente
0

En Anjuta, vaya al menú Generar, luego Configurar Proyecto. En el cuadro Configurar opciones, agregue:

LDFLAGS='-lpthread'

Espero que ayude a alguien también ...

naXa
fuente
0

A veces, si usa varias bibliotecas, verifique la dependencia de la biblioteca. (por ejemplo, -lpthread -lSDL ... <==> ... -lSDL -lpthread)

usuario1793997
fuente