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?


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

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


0

Kompilieren Sie den Code mit dem folgenden Befehl

gcc filename.c -lpthread -lrt

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.