¿gcc no puede vincularse a pthread?

17

Recientemente instalé XUbuntu 11.10 64bit, pero tengo problemas para compilar el ejemplo más simple de pthread.

Aquí está el código pthread_simple.c:

#include <stdio.h>
#include <pthread.h> 
main()  {
  pthread_t f2_thread, f1_thread; 
  void *f2(), *f1();
  int i1,i2;
  i1 = 1;
  i2 = 2;
  pthread_create(&f1_thread,NULL,f1,&i1);
  pthread_create(&f2_thread,NULL,f2,&i2);
  pthread_join(f1_thread,NULL);
  pthread_join(f2_thread,NULL);
}
void *f1(int *x){
  int i;
  i = *x;
  sleep(1);
  printf("f1: %d",i);
  pthread_exit(0); 
}
void *f2(int *x){
  int i;
  i = *x;
  sleep(1);
  printf("f2: %d",i);
  pthread_exit(0); 
}

Y aquí está el comando de compilación

gcc -lpthread pthread_simple.c

Los resultados:

lptang @ tlp-linux: ~ / test / test-pthread $ gcc -lpthread pthread_simple.c 
/tmp/ccmV0LdM.o: en la función `main ':
pthread_simple.c :(. text + 0x2c): referencia indefinida a `pthread_create '
pthread_simple.c :(. text + 0x46): referencia indefinida a `pthread_create '
pthread_simple.c :(. text + 0x57): referencia indefinida a `pthread_join '
pthread_simple.c :(. text + 0x68): referencia indefinida a `pthread_join '
collect2: ld devolvió 1 estado de salida

¿Alguien sabe qué está causando el problema?

chtlp
fuente
¿Es culpa de stackexchange que tenga inclusiones vacías en las dos primeras líneas? Debería haber un#include <pthread.h>
Frg
Sí, usé el pre ambiente. Ahora debería mostrarse correctamente.
chtlp
Por cierto, compila con -Wall, te faltan encabezados. (Y sr_ es correcto.)
Mat

Respuestas:

26

En las últimas versiones del gcccompilador se requiere que las bibliotecas sigan el objeto o los archivos fuente.

Entonces, para compilar esto debería ser:

gcc pthread_sample.c -lpthread

Normalmente, aunque el código pthread se compila de esta manera:

gcc -pthread pthread_sample.c
Karlson
fuente
1
@Karlson ¿Puede explicar por qué simplemente incluir el pthread.harchivo no es suficiente para que gcc resuelva las referencias?
Quazi Irfan
2
@iamcreasy Porque declaración no es lo mismo que definición. El programa necesita saber dónde está el código que ejecuta una función particular.
Karlson el
1
gcc -o exectable_namme pthread_sample.c -lpthread
Rodrigue SAOUNGOUMI SOURPELE
fuente
3
Sería útil editar su respuesta para explicar por qué esto es diferente de la respuesta ya aceptada.
roaima
0

compilar código usando el siguiente comando

gcc filename.c -lpthread -lrt
usuario109578
fuente
1
¡Hola! Sería útil si pudiera editar su respuesta para explicar por qué funciona y resaltar por qué cree que agrega algo que la respuesta ya aceptada no cubre.
dhag