2010-04-21 13 views
10

Używam pliku pthread.h w pliku . gdy próbuję użyć pthread_exit(0); lub pthread_join(mythrds[yy],NULL); mówi:Używanie pthread w języku C++

.cc:(.text+0x3e): undefined reference to `pthread_exit' 

gdy spełnione bardzo podobny kod w pliku *.c z GCC to działa idealnie. Jak mogę używać Pthread w C++ .. (Dodałem też -lpthread)

.. 
void *myThreads (void *ptr) 
{ 
... 
pthread_exit(0); 
} 
.. 

flagi:

g++ -lpthread -Wall -static -W -O9 -funroll-all-loops -finline -ffast-math 

Odpowiedz

21

Możesz spróbować użyć opcji -pthread do g ++.

-pthread 
     Adds support for multithreading with the pthreads library. This 
     option sets flags for both the preprocessor and linker. 
+0

thnks dużo, to na pewno pomogło. Myślałem, że -lpthread robi to samo, ale tak nie jest. – ogzylz

+0

Możesz dowiedzieć się, co -pthread robi na twojej platformie używając "gcc -dumpspecs" i szuka rzeczy, które zaczynają się "% {pthread" – Flexo

+0

Opcja "-lpthread" zawiera tylko bibliotekę pthread. To może nie wystarczyć na twojej platformie, aby uzyskać wsparcie dla pthreads. –

1

Czy pliki nagłówkowe Pthread mieć extern "C" { ... } wokół prototypów funkcji? Jest to typowy przypadek, gdy linker nie może łączyć w C++.

Występuje, ponieważ C++ na ogół robi wymapowanie nazw, dzięki czemu może kodować szczegóły parametru w symbole (zezwalając na polimorfizm). Na przykład funkcje:

void x(int); 
void x(void); 
void x(char,int,float,double); 

wszystkie otrzymują różne symbole łączników.

Jeśli pliki nagłówkowe nie mają extern "C" { ... }, może trzeba to zrobić samemu:

extern "C" { 
    #include <pthread.h> 
} 

miejmy nadzieję, że będzie działać.

+0

thnk, ale problem nie był taki. – ogzylz