J'ai pris le code suivant dans un fichier de pratique
#include <stdio.h>
#include <pthread.h>
void *kidfunc(void *p)
{
printf ("Kid ID is ---> %d\n", getpid( ));
}
int main(int count, char* argv[])
{
pthread_t kid ;
pthread_create (&kid, NULL, kidfunc, NULL) ;
printf ("Parent ID is ---> %d\n", getpid( )) ;
pthread_join (kid, NULL) ;
printf ("No more kid!\n") ;
return 0;
}
Mais lorsque je le compile sur mon ordinateur portable (sous Ubuntu 14.04), l'erreur suivante est générée:
ahsan-15f8116@VirtualWorld:~$ gcc example.c
/tmp/ccOB6cIT.o: In function `main':
example.c:(.text+0x4a): undefined reference to `pthread_create'
example.c:(.text+0x71): undefined reference to `pthread_join'
collect2: error: ld returned 1 exit status
Cela n'a aucun sens pour moi, car l'en-tête inclut pthread.h
, pouvez-vous me dire ce que je fais mal ici?
Les en-têtes uniquement déclarent des fonctions, c’est bibliothèques que définit leur.
En règle générale, vous devez ajouter des bibliothèques pour être liées explicitement sur la ligne de commande gcc
, par exemple. gcc -o prog prog.c -lm
pour la bibliothèque mathématique libm
. Cependant, la bibliothèque pthread
constitue un cas particulier - elle est liée par un indicateur de compilation spécial -pthread
:
gcc -pthread example.c
De man gcc
-pthread
Adds support for multithreading with the pthreads library. This
option sets flags for both the preprocessor and linker.
Simple ... utilisez libpthread.so:
$ gcc -o EXAMPLE -lpthread example.c
$ ./EXAMPLE
Parent ID is ---> 9280
Kid ID is ---> 9280
No more kid!