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?

Ralph
źródło
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ć.

Zatrudniony rosyjski
źródło
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,
7
@sholsapp Oto wyjaśnienie: webpages.charter.net/ppluzhnikov/linker.html
Zatrudniony rosyjski
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”

sam
źródło
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!

Alexander Nenartovich
źródło
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.
Gopika BG
źródło
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")
Jayhello
źródło
7

Skompiluj to w ten sposób: gcc demo.c -o demo -pthread

uprzejmy
źródło
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}
)
Rufus
źródło
4

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

Linker -> Wiersz poleceń -> Opcje dodatkowe

Wpisz w -pthreadpolu tekstowym.

WBuck
źródło
3

Musisz użyć tej opcji -lpthreadz gcc.

Xiaolong
źródło
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

sam
źródło
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.
       ....
kalu Wang
źródło
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 ...

naXa
źródło
0

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

użytkownik1793997
źródło