2013-02-27 13 views
5

Używam Eclipse na Fedorze 17 (z GCC) i mam niezdefiniowane odwołanie do pthread_create(), nawet jeśli pthread.h jest włączone i jeśli mam -lpthread na linii poleceń build gcc. ..pthread biblioteka undefined odniesienie

Oto mój kod, na wszelki wypadek

void* repair() 
{ 
    int var; 
    for (var = 0; var < NB_ITER ; var += 2) 
    { 
     printf("PAIR : %d\n", var); 
    } 

return NULL; 
} // pair 

void exo03() 
{ 
    pthread_t id1; 
    pthread_create(&id1, NULL, &repair, NULL); 
} 

Dziękuję za pomoc :)

+1

Prawdopodobnie zapomniałeś (-aś) o połączeniu z biblioteką pthread. Dodaj '-lpthread' w poleceniu kompilacji jako ostatnie. –

+0

Czy możesz podać pełny przykład polecenia i błędów kompilatora? – simonc

Odpowiedz

8

na Linuksie, FreeBSD (i niektóre inne smaki * nix) należy użyć opcji kompilatora -pthread i nie próbujesz połączyć się z biblioteką pthread.

Dla eclipse:

Eclipse nie jest skonfigurowany tak, aby umieścić -pthread argumentu w gcc kompilacji. Aby rozwiązać ten problem, przejdź do menu:

Project -> Properties

c/C++ Build -> GCC C Compiler -> Różne

Dodaj „-pthread” argumentu na początku „ Inne Flags”

go również:

C/C++ build -> Ustawienia -> Linker GCC C -> biblioteki

i obejmują„pthread "Biblioteka do innych bibliotek. Kliknij Zastosuj i odbuduj projekt . Pthreads musi teraz działać.

Od man gcc:

-pthread: Dodaje wsparcie dla wielowątkowości z biblioteką Pthreads. Ta opcja ustawia flagi dla preprocesora i łącznika.

znalazłem explanation here:

W GCC, (aka -pthreads) opcja -pthread zarządza zarówno kompilator preprocesor/i/łącznik włączyć kompilację z wątków. preprocesor będą określać/włączenia/użyć POSIX wersji niektórych makra (lub wykonać, aby umożliwić zestawienie warunkowego POSIX Logic), a łącznik specyficznie łączą otrzymanego przedmiotu na libpthread

Jednakże -lpthread po prostu mówi linkerowi, aby spróbował rozwiązać jakiekolwiek zewnętrzne odnośniki względem biblioteki libpthread, w ten sam sposób, co , że -lm mówi łącznikowi, aby spróbował rozwiązać jakiekolwiek zewnętrzne referencje względem biblioteki libm. W przypadku -lpthread Twój kod może nie zawierać zewnętrznych odnośników do libpthread, nawet jeśli napisałeś kod wątku Posix , ponieważ makra krytyczne nie zostały włączone.

+0

Dlaczego nie połączyć z libpthread? –

+0

@ bash.d: ponieważ bez opcji '-pthread', compîler i linker nie znajdą właściwej biblioteki pthread :) –

+0

Okay, dziękuję, zapomniałem o tym! –

4

Czy łączysz się z libpthread?