Niezdefiniowane odniesienie do pthread_create w systemie Linux


376

Wybrałem następujące demo z Internetu z https://computing.llnl.gov/tutorials/pthreads/

#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   printf("Hello World! It's me, thread #%ld!\n", tid);
   pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0; t<NUM_THREADS; t++){
      printf("In main: creating thread %ld\n", t);
      rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }
   pthread_exit(NULL);
}

Ale kiedy kompiluję to na moim komputerze (z systemem Ubuntu Linux 9.04) pojawia się następujący błąd:

corey@ubuntu:~/demo$ gcc -o term term.c
term.c: In function main’:
term.c:23: warning: incompatible implicit declaration of built-in function exit
/tmp/cc8BMzwx.o: In function `main':
term.c:(.text+0x82): undefined reference to `pthread_create'
collect2: ld returned 1 exit status

Nie ma to dla mnie sensu, ponieważ nagłówek zawiera pthread.h, który powinien mieć pthread_createfunkcję. Jakieś pomysły, co się dzieje?


6
Dodatkowo: w zależności od platformy, może być konieczne (a) inny kompilator dla wątków, (B) inny libc dla wątków (tj -lc_r), (c) -threadlub -threadslub inne, zamiast lub oprócz -lpthread.
ephemient

Nieco powyżej tego przykładu zobaczysz tabelę poprawnych poleceń kompilatora, niezależnie od tego, czy jest to GCC, IBM itp. „Zatrudniony rosyjski” jest poprawny.
Jonathon Reinhart

8
Czy możesz odznaczyć moją odpowiedź, abym mógł ją usunąć (i zaznaczyć tę, która jest prawdziwa, czyli ta, która uzyskała najwyższy głos)?
Pavel Minaev

3
-lpthreadjest potrzebny podczas kompilacji
How Chen

5
rozwiązanieLDFLAGS= -pthread -lpthread
dsnk,

Odpowiedzi:


696

Obie odpowiedzi na to pytanie są do tej pory niepoprawne .
W przypadku systemu Linux poprawne polecenie to:

gcc -pthread -o term term.c

Ogólnie rzecz biorąc, biblioteki powinny podążać za źródłami i obiektami w wierszu poleceń i -lpthreadnie są „opcją”, lecz specyfikacją biblioteki. W systemie tylko z libpthread.azainstalowanym

gcc -lpthread ...

nie uda się połączyć.


2
+1 to rozwiązanie działało ... inne nie. Sugestia, że ​​„biblioteki powinny podążać za źródłami i obiektami”, jest świetną radą - cytat lub dalsze wyjaśnienia byłyby świetne.
sholsapp,


Nadal to dla mnie błędne, dopóki nie położyłem -thpthread na samym końcu mojej komendy. gcc term.c -lpthread
CornSmith 18.04.13

Właśnie natrafiłem na problem z kompilacją snortsam na Ubuntu 14.04, który faktycznie zawiera zarówno libpthread.a, jak i libpthread.so. Dostawałem undefined reference to 'pthread_cancel'i undefined reference to 'pthread_create'błędy. Natknąłem się na ten post SO i pomyślałem, że wypróbuję odpowiedź dla rosyjskiego zatrudnienia. Otworzyłem się makesnortsam.shw VI i uruchomiłem polecenie :%s/lpthread/pthread/gzamiany lpthread na pthread, aby używał -pthreadzamiast -lpthreadkompilacji. Byłem wtedy w stanie skompilować snortsam. Dzięki Zatrudniony rosyjski!
dcarrith

5
Dla każdego, kto używa CODEBLOCKS: Dodaj -pthreaddo Opcje kompilacji projektu -> Ustawienia łącznika -> Inne opcje łącznika.
user3728501

39

w zaćmieniu

właściwości-> c / c ++ Build-> ustawienia-> GCC C ++ linker-> biblioteki w górnej części dodaj „pthread”


Ta sama wskazówka dotyczy kodu :: project (i myślę, że inni też IDE)
Fil

19

Uruchamiając z terminala Linuksa, działało dla mnie kompilowanie za pomocą następującego polecenia (załóżmy, że plik c, który chcę skompilować, nazywa się test.c):

gcc -o test test.c -pthread

Mam nadzieję, że to komuś pomaga!


19

W przypadku systemu Linux poprawne polecenie to:

gcc -o term term.c -lpthread
  1. musisz wstawić -lpthread zaraz po komendzie kompilacji, ta komenda powie kompilatorowi, aby wykonał program z biblioteką pthread.h.
  2. gcc -l łączy się z plikiem biblioteki. Link -l z nazwą biblioteki bez prefiksu lib.

Nie jest dobrym pomysłem stosowanie niestandardowej flagi, gdy istnieje standardowa flaga, która ma tę samą funkcję na twojej platformie.
David Schwartz,


12

Jeśli używasz cmake, możesz użyć:

add_compile_options(-pthread)

Lub

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")


6

Uważam, że właściwym sposobem dodając pthreadw CMaketo z następujących

find_package (Threads REQUIRED)

target_link_libraries(helloworld
    ${CMAKE_THREAD_LIBS_INIT}
)

4

W Visual Studio 2019 określ -pthreadna stronach właściwości projektu w:

Linker -> Wiersz poleceń -> Opcje dodatkowe

Wpisz w -pthreadpolu tekstowym.


3

Musisz użyć tej opcji -lpthreadz gcc.


7
błędna informacja! -lpthreadnie jest „opcją”, określa bibliotekę.

opcja wiersza poleceń (w przeciwieństwie do argumentu wiersza poleceń)
Alexander Stohr

3

wystarczy dodać „pthread” we właściwościach => C / C ++ build => GCC C ++ Linker => Biblioteki => górna część „Biblioteki (-l)”. Otóż ​​to


2

sprawdź stronę podręcznika, a dostaniesz.

Skompiluj i połącz za pomocą -pthread.

SYNOPSIS
       #include <pthread.h>

       int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);


       Compile and link with -pthread.
       ....

0

W Anjuta przejdź do menu Kompilacja, a następnie Konfiguruj projekt. W polu Konfiguruj opcje dodaj:

LDFLAGS='-lpthread'

Mam nadzieję, że to też komuś pomoże ...


0

Czasami, jeśli korzystasz z wielu bibliotek, sprawdź zależność biblioteki. (np. -lpthread -lSDL ... <==> ... -lSDL -lpthread)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.