Ongedefinieerde verwijzing naar pthread_create in Linux

Ik heb de volgende demo van internet gehaald van 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);
}

Maar als ik het compileer op mijn computer (met Ubuntu Linux 9.04) krijg ik de volgende foutmelding:

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

Dit slaat voor mij nergens op, omdat de header pthread.h bevat, die de functie pthread_create zou moeten hebben. Enig idee wat er mis gaat?


Antwoord 1, autoriteit 100%

Voor Linux is het juiste commando:

gcc -pthread -o term term.c

Over het algemeen zouden bibliotheken bronnen en objecten op de opdrachtregel moeten volgen, en -lpthread is geen “optie”, het is een bibliotheekspecificatie. Op een systeem waarop alleen libpthread.a is geïnstalleerd,

gcc -lpthread ...

kan niet linken.


Antwoord 2, autoriteit 5%

in verduistering

properties->c/c++Build->setting->GCC C++ linker->bibliotheken in het bovenste gedeelte voeg “pthread” toe


Antwoord 3, autoriteit 5%

Voor Linux is het juiste commando:

gcc -o term term.c -lpthread
  1. je moet -lpthread net na de compile-opdracht plaatsen, deze opdracht zal de compiler vertellen om het programma uit te voeren met de pthread.h-bibliotheek.
  2. gcc -l linkt met een bibliotheekbestand.Link -l met bibliotheeknaam zonder het lib-voorvoegsel.

Antwoord 4, autoriteit 3%

Uitgevoerd vanaf de Linux-terminal, wat voor mij werkte, was compileren met het volgende commando (stel dat het c-bestand dat ik wil compileren test.c heet):

gcc -o test test.c -pthread

Ik hoop dat het iemand helpt!


Antwoord 5, autoriteit 2%

Ik geloof dat de juiste manier om pthread toe te voegen in CMake is met het volgende

find_package (Threads REQUIRED)
target_link_libraries(helloworld
    ${CMAKE_THREAD_LIBS_INIT}
)

Antwoord 6, autoriteit 2%

Eigenlijk geeft het verschillende voorbeelden van compileercommando’s die worden gebruikt voor pthreads-codes die in de onderstaande tabel worden vermeld, als u de volgende zelfstudie verder leest:

https://computing.llnl.gov/tutorials/pthreads/#Compiling

voer hier de afbeeldingsbeschrijving in


Antwoord 7, autoriteit 2%

Als u cmake gebruikt, kunt u het volgende gebruiken:

add_compile_options(-pthread)

Of

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

Antwoord 8

Compileer het als volgt: gcc demo.c -o demo -pthread


Antwoord 9

Geef in Visual Studio 2019 -pthread op in de eigenschappenpagina’s voor het project onder:

Linker -> Opdrachtregel -> Extra opties

Typ -pthread in het tekstvak.


Antwoord 10

Je moet de optie -lpthread gebruiken met gcc.


Antwoord 11

u hoeft alleen “pthread” toe te voegen in proprieties=>C/C++ build=>GCC C++ Linker=>Libraries=> bovenste gedeelte “Bibliotheken(-l)”.
dat is het


Antwoord 12

Omdat geen van de antwoorden precies aan mijn behoefte voldeed (met behulp van MSVS-code), voeg ik hier ook mijn ervaring met deze IDE- en CMAKE-buildtools toe.

Stap 1: Zorg ervoor dat u in uw .cpp (of .hpp indien nodig) het volgende heeft opgenomen:

#include <functional>

Stap 2 Voor MSVSCode IDE-gebruikers:
Voeg deze regel toe aan uw c_cpp_properties.json-bestand:

"compilerArgs": ["-pthread"],

Voeg deze regel toe aan uw c_cpp_properties.json-bestand

Stap 2 Voor gebruikers van CMAKE build-tools:
Voeg deze regel toe aan uw CMakeLists.txt

set(CMAKE_CXX_FLAGS "-pthread")

Opmerking: het toevoegen van de vlag -lpthread (in plaats van -pthread) resulteert in een mislukte koppeling.


Antwoord 13

controleer de man-pagina en je zult krijgen.

Compileren en linken met -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.
       ....

Antwoord 14

Ga in Anjuta naar het menu Bouwen en vervolgens naar Project configureren.
Voeg in het vak Opties configureren toe:

LDFLAGS='-lpthread'

Hopelijk helpt het ook iemand…


Antwoord 15

Soms, als u meerdere bibliotheken gebruikt, controleert u de bibliotheekafhankelijkheid.
(bijv. -lpthread -lSDL… <==> … -lSDL -lpthread)

LEAVE A REPLY

Please enter your comment!
Please enter your name here

19 + eleven =

Other episodes