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.h
que debe tener la pthread_create
función. ¿Alguna idea de lo que va mal?
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!
Gopika BG
Para Linux el comando correcto es:
gcc -o term term.c -lpthread
- 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.
- 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
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
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.
....
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