Referencia indefinida a pthread_create en Linux

4 minutos de lectura

avatar de usuario
rafael

Recogí la siguiente demostración de la web de 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
      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.hque debe tener la pthread_create función. ¿Alguna idea de lo que va mal?

  • Además: dependiendo de la plataforma, es posible que necesite (a) un compilador diferente para subprocesos, (b) una libc diferente para subprocesos (es decir, -lc_r), (C) -thread o -threads u otros, en lugar de o además de -lpthread.

    – efímero

    3 de noviembre de 2009 a las 1:42

  • Justo un poco más arriba de ese ejemplo, verá una tabla de los comandos correctos del compilador, ya sea GCC, IBM, etc. ‘Employed Russian’ es correcto.

    – Jonathan Reinhart

    26 de junio de 2011 a las 6:47

  • ¿Puede desmarcar mi respuesta para que pueda eliminarla (y marcar la que realmente es correcta, que es la más votada)?

    – Pavel Minaev

    22 de noviembre de 2012 a las 0:41

  • -lpthread es necesario durante la compilación

    – Cómo Chen

    28 de enero de 2014 a las 8:21

  • solución LDFLAGS= -pthread -lpthread

    – dsnk

    29 de octubre de 2015 a las 9:01

avatar de usuario
Ruso empleado

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 biblioteca. En un sistema con sólo libpthread.a instalado,

gcc -lpthread ...

no se podrá vincular.

  • +1 esta solución funcionó… otras no. Además, la sugerencia de que ‘las bibliotecas deben seguir las fuentes y los objetos’ es un gran consejo: una cita o una explicación más detallada sería genial.

    – sholsapp

    13 de enero de 2012 a las 3:02

  • @sholsapp Aquí está la explicación: webpages.charter.net/pluzhnikov/linker.html

    – Ruso empleado

    13 de enero de 2012 a las 4:33

  • Esto todavía me dio error hasta que puse -lpthread al final de mi comando. gcc term.c -lpthread

    – CornSmith

    18 de abril de 2013 a las 23:49

  • Para cualquiera que use CODEBLOCKS: Agregar -pthread a Opciones de creación del proyecto -> Configuración del vinculador -> Otras opciones del vinculador.

    – Consultor independiente

    4 oct 2015 a las 13:23


  • “En un sistema con solo libpthread.a instalado”…… o libpthread.so derecho ?

    – Contador م

    13 de abril de 2019 a las 18:04

Si está usando cmake, puede usar:

add_compile_options(-pthread)

O

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")

Creo que la forma correcta de agregar pthread en CMake es con lo siguiente

find_package (Threads REQUIRED)

target_link_libraries(helloworld
    ${CMAKE_THREAD_LIBS_INIT}
)

  • Esto tiene el mismo efecto pero usó el destino Threads::Threads en lugar de la variable CMAKE_THREAD_LIBS_INIT. target_link_libraries(helloworld PUBLIC Threads::Threads)

    –Aidan Gallagher

    9 de agosto de 2020 a las 16:34


Al ejecutar 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!

avatar de usuario
Gopika BG

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 vincula con un archivo de biblioteca. Vincula -l con el nombre de la biblioteca sin el prefijo lib.

  • 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

    25 de septiembre de 2019 a las 2:01

avatar de usuario
leesagacious

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

  • 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

    25 de septiembre de 2019 a las 2:01

avatar de usuario
kalu wang

consulte la página del manual y obtendrá.

Compile y vincule 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.
       ....

¿Ha sido útil esta solución?