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 Kompilierungsbefehl
gcc -lpthread pthread_simple.c
Die Ergebnisse:
lptang@tlp-linux:~/test/test-pthread$ gcc -lpthread pthread_simple.c /tmp/ccmV0LdM.o: In function `main": pthread_simple.c:(.text+0x2c): undefined reference to `pthread_create" pthread_simple.c:(.text+0x46): undefined reference to `pthread_create" pthread_simple.c:(.text+0x57): undefined reference to `pthread_join" pthread_simple.c:(.text+0x68): undefined reference to `pthread_join" collect2: ld returned 1 exit status
Weiß jemand was? “ Verursacht das Problem?
Kommentare
- Ist es der Fehler von stackexchange ', dass Sie leere Includes haben In den ersten beiden Zeilen sollte ein
#include <pthread.h>
- vorhanden sein. Ja, ich habe die Vorumgebung verwendet. Sie sollte jetzt korrekt angezeigt werden.
- Versucht
gcc -pthread...
? - Übrigens, bitte kompilieren Sie mit
-Wall
, Sie ' haben keine Header. (Und sr_ ist korrekt.)
Antwort
In der lat Die meisten Versionen des gcc
-Compilers erfordern, dass Bibliotheken den Objekt- oder Quelldateien folgen.
Um dies zu kompilieren, sollte dies sein:
gcc pthread_sample.c -lpthread
Normalerweise wird Pthread-Code folgendermaßen kompiliert:
gcc -pthread pthread_sample.c
Kommentare
- @Karlson Können Sie bitte erklären, warum es für gcc nicht ausreicht, nur die Datei
pthread.h
einzuschließen, um die Referenzen aufzulösen? - @iamcreasy Weil dies nicht der Fall ist das gleiche wie Definition. Das Programm muss wissen, wo sich der Code befindet, der eine bestimmte Funktion ausführt.
Antwort
gcc -o exectable_namme pthread_sample.c -lpthread
Kommentare
- Es wäre hilfreich, Ihre Antwort zu bearbeiten , um zu erklären, warum Dies unterscheidet sich von der bereits akzeptierten Antwort.
Antwort
Kompilieren Sie den Code mit dem folgenden Befehl
gcc filename.c -lpthread -lrt
Kommentare
- Hi! 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.