2011-07-15 2 views
0

Lorsque j'essaie de compiler un programme C avec multithreading dans Fedora, j'obtiens l'erreur suivante.Problème lors de la compilation de la fonction C avec thread sur Fedora

Le nom du fichier est abc.c

abc.c:(.text+0x39): undefined reference to `pthread_create' 
abc.c:(.text+0x61): undefined reference to `pthread_create' 
abc.c:(.text+0x79): undefined reference to `pthread_join' 
abc.c:(.text+0x8d): undefined reference to `pthread_join' 

J'ai vérifié dans/usr/include et je trouve que pthread.h est présent. J'ai également essayé de copier pthread.h dans le même répertoire que abc.c

Comment résoudre ces erreurs de liaison?

+5

gcc -o myexe abc.c -lpthread ??? – George

Répondre

3

Comme l'a souligné George, vous devez créer un lien avec la bibliothèque de fil gcc -o abc abc.c -pthread La raison pour laquelle vous obtenez ces erreurs est parce que lors de l'étape de liaison du compilateur essaie de remplir tous les emplacements où il avait placé des espaces réservés pour les appels de méthode dont il savait qu'ils étaient définis mais qui ne connaissaient pas leur emplacement car la bibliothèque appropriée n'avait pas encore été liée. Comme l'indique caf en utilisant l'indicateur -pthread à la fois dans les étapes de compilation et de liaison, le compilateur peut faire des choix plus intelligents sur ce qu'il doit utiliser pour être thread-safe dans certaines conditions.

+4

L'utilisation moderne est de fournir '-pthread' aux étapes de compilation et de liaison (note - non' -l'), qui à son tour demande que la bibliothèque nécessaire soit liée. Cela permet également au compilateur de modifier sa sortie d'une autre manière en fonction de la production de code multithread. – caf

+0

Je compile habituellement gcc -c sans le drapeau -pthread mais quand je fais le lien j'utilise -lpthread, y at-il une différence? Je suppose que si elle connaît des pthreads au cours de la phase de compilation, elle peut ajouter des optimisations. –

+0

Je pense que cela dépend de l'architecture et de la bibliothèque C utilisées pour savoir si c'est un no-op au stade de compilation ou non. – caf

Questions connexes