gcc kann nicht mit pthread verlinken?

16

Ich habe kürzlich XUbuntu 11.10 64bit installiert, habe jedoch Probleme beim Kompilieren des einfachsten pthread-Beispiels.

Hier ist der Code 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); 
}

Und hier ist der Kompilierbefehl

gcc -lpthread pthread_simple.c

Die Ergebnisse:

lptang @ tlp-linux: ~ / test / test-pthread $ gcc -lpthread pthread_simple.c 
/tmp/ccmV0LdM.o: In der Funktion "main":
pthread_simple.c :(. text + 0x2c): undefinierter Verweis auf `pthread_create '
pthread_simple.c :(. text + 0x46): undefinierter Verweis auf `pthread_create '
pthread_simple.c :(. text + 0x57): undefinierter Verweis auf `pthread_join '
pthread_simple.c :(. text + 0x68): undefinierter Verweis auf `pthread_join '
collect2: ld hat 1 Exit-Status zurückgegeben

Weiß jemand, was das Problem verursacht?

chtlp
quelle
Ist es der Fehler von stackexchange, dass Sie leere Includes in den ersten beiden Zeilen haben? Es sollte einen#include <pthread.h>
Frg
Ja, ich habe die Vorumgebung verwendet. Es sollte jetzt korrekt angezeigt werden.
chtlp
Übrigens, bitte kompilieren Sie mit -Wall, Sie haben keine Überschriften. (Und sr_ ist richtig.)
Mat

Antworten:

26

In den neuesten Versionen des gccCompilers müssen die Bibliotheken den Objekt- oder Quelldateien folgen.

Um dies zu kompilieren, sollte es also sein:

gcc pthread_sample.c -lpthread

Normalerweise wird der pthread-Code folgendermaßen kompiliert:

gcc -pthread pthread_sample.c
Karlson
quelle
1
@ Karlson Kannst du bitte erklären, warum es pthread.hfür gcc nicht ausreicht, die Datei einzuschließen , um die Verweise aufzulösen?
Quazi Irfan
2
@iamcreasy Da die Deklaration nicht mit der Definition identisch ist. Das Programm muss wissen, wo sich der Code befindet, der eine bestimmte Funktion ausführt.
Karlson
1
gcc -o exectable_namme pthread_sample.c -lpthread
Rodrigue SAOUNGOUMI SOURPELE
quelle
3
Es wäre hilfreich , Ihre Antwort zu bearbeiten, um zu erklären, warum sich diese von der bereits akzeptierten Antwort unterscheidet.
Roaima
0

Kompilieren Sie den Code mit dem folgenden Befehl

gcc filename.c -lpthread -lrt
user109578
quelle
1
Hallo! Es wäre hilfreich, wenn Sie Ihre Antwort bearbeiten könnten, um zu erklären, warum sie funktioniert, und um hervorzuheben, warum sie Ihrer Meinung nach etwas hinzufügt, das die bereits akzeptierte Antwort nicht abdeckt.
Dhag