web-dev-qa-db-fra.com

Erreur: /tmp/ccOB6cIT.o: Dans la fonction `main ': example.c :(. Text + 0x4a)

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?

1
Weaboo

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.
2
steeldriver

Simple ... utilisez libpthread.so:

$ gcc -o EXAMPLE -lpthread example.c

$ ./EXAMPLE
Parent ID is ---> 9280          
Kid ID is ---> 9280             
No more kid!
1
Knud Larsen