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?


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.


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"


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!


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.

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")


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}
)

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.


3

Necesita usar la opción -lpthreadcon gcc.


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


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.
       ....

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 ...


0

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.