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.