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_create
funkcję. Jakieś pomysły, co się dzieje?
c
linux
multithreading
pthreads
Ralph
źródło
źródło
-lc_r
), (c)-thread
lub-threads
lub inne, zamiast lub oprócz-lpthread
.-lpthread
jest potrzebny podczas kompilacjiLDFLAGS= -pthread -lpthread
Odpowiedzi:
Obie odpowiedzi na to pytanie są do tej pory niepoprawne .
W przypadku systemu Linux poprawne polecenie to:
Ogólnie rzecz biorąc, biblioteki powinny podążać za źródłami i obiektami w wierszu poleceń i
-lpthread
nie są „opcją”, lecz specyfikacją biblioteki. W systemie tylko zlibpthread.a
zainstalowanymnie uda się połączyć.
źródło
gcc term.c -lpthread
undefined reference to 'pthread_cancel'
iundefined 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.sh
w VI i uruchomiłem polecenie:%s/lpthread/pthread/g
zamiany lpthread na pthread, aby używał-pthread
zamiast-lpthread
kompilacji. Byłem wtedy w stanie skompilować snortsam. Dzięki Zatrudniony rosyjski!-pthread
do Opcje kompilacji projektu -> Ustawienia łącznika -> Inne opcje łącznika.w zaćmieniu
właściwości-> c / c ++ Build-> ustawienia-> GCC C ++ linker-> biblioteki w górnej części dodaj „pthread”
źródło
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):
Mam nadzieję, że to komuś pomaga!
źródło
W przypadku systemu Linux poprawne polecenie to:
źródło
Rzeczywiście, podaje kilka przykładów komend kompilacyjnych używanych dla kodów pthreads wymienionych w poniższej tabeli, jeśli będziesz nadal czytać następujący samouczek:
https://computing.llnl.gov/tutorials/pthreads/#Compiling
źródło
Jeśli używasz cmake, możesz użyć:
Lub
źródło
Skompiluj to w ten sposób: gcc demo.c -o demo -pthread
źródło
Uważam, że właściwym sposobem dodając
pthread
wCMake
to z następującychźródło
W Visual Studio 2019 określ
-pthread
na stronach właściwości projektu w:Wpisz w
-pthread
polu tekstowym.źródło
Musisz użyć tej opcji
-lpthread
z gcc.źródło
-lpthread
nie jest „opcją”, określa bibliotekę.wystarczy dodać „pthread” we właściwościach => C / C ++ build => GCC C ++ Linker => Biblioteki => górna część „Biblioteki (-l)”. Otóż to
źródło
sprawdź stronę podręcznika, a dostaniesz.
Skompiluj i połącz za pomocą -pthread.
źródło
W Anjuta przejdź do menu Kompilacja, a następnie Konfiguruj projekt. W polu Konfiguruj opcje dodaj:
Mam nadzieję, że to też komuś pomoże ...
źródło
Czasami, jeśli korzystasz z wielu bibliotek, sprawdź zależność biblioteki. (np. -lpthread -lSDL ... <==> ... -lSDL -lpthread)
źródło