gcc non può collegarsi a pthread?


17

Di recente ho installato XUbuntu 11.10 a 64 bit, ma ho problemi a compilare l'esempio pthread più semplice.

Ecco il codice 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); 
}

Ed ecco il comando di compilazione

gcc -lpthread pthread_simple.c

I risultati:

lptang @ tlp-linux: ~ / test / test-pthread $ gcc -lpthread pthread_simple.c 
/tmp/ccmV0LdM.o: nella funzione `main ':
pthread_simple.c :(. text + 0x2c): riferimento indefinito a `pthread_create '
pthread_simple.c :(. text + 0x46): riferimento indefinito a `pthread_create '
pthread_simple.c :(. text + 0x57): riferimento indefinito a `pthread_join '
pthread_simple.c :(. text + 0x68): riferimento indefinito a `pthread_join '
collect2: ld ha restituito 1 stato di uscita

Qualcuno sa cosa sta causando il problema?


È colpa di stackexchange che hai vuoti include nelle prime due righe? Ci dovrebbe essere un#include <pthread.h>
Frg

Sì, ho usato il pre-ambiente. Ora dovrebbe essere visualizzato correttamente.
chtlp


A proposito, ti preghiamo di compilare -Wall, ti stai perdendo le intestazioni. (E sr_ è corretto.)
Mat

Risposte:


26

Nelle ultime versioni del gcccompilatore è necessario che le librerie seguano l'oggetto o i file di origine.

Quindi per compilare questo dovrebbe essere:

gcc pthread_sample.c -lpthread

Normalmente sebbene il codice pthread sia compilato in questo modo:

gcc -pthread pthread_sample.c

1
@Karlson Per favore, puoi spiegare perché includere semplicemente il pthread.hfile non è sufficiente affinché gcc risolva i riferimenti?
Quazi Irfan,

2
@iamcreasy Perché la dichiarazione non è la stessa della definizione. Il programma deve sapere dove si trova il codice che esegue una particolare funzione.
Karlson,


0

compilare il codice usando il seguente comando

gcc filename.c -lpthread -lrt

1
Ciao! Sarebbe utile se potessi modificare la tua risposta per spiegare perché funziona e per evidenziare perché pensi che aggiunga qualcosa che la risposta già accettata non copre.
dhag,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.