avec -lpthread, compilateur g++ erreur “undefined reference to ” sémaphore appels tels que "sem_open'
Je suis nouveau à posix thread library, et j'ai essayé de compiler un exemple de code à partir d'un tutoriel avec:
g++ -lpthread agreement.cpp -o agreement
cependant je n'étais pas en mesure de compiler le code et j'ai obtenu le message d'erreur suivant:
a3q2.cpp:(.text+0x7e): undefined reference to `sem_open'
a3q2.cpp:(.text+0xab): undefined reference to `sem_wait'
a3q2.cpp:(.text+0x290): undefined reference to `sem_post'
a3q2.cpp:(.text+0x2af): undefined reference to `sem_close'
a3q2.cpp:(.text+0x2bb): undefined reference to `sem_unlink'
collect2: ld returned 1 exit status
make: *** [a3q2_exe] Error 1
Je suis conscient que -lpthread est nécessaire pour la compilation de travail, mais est-il des autres options je pourrais avoir besoin pour résoudre le problème? si non, comment dois-je installer le "bon" bibliothèque pthread?
Merci pour votre aide!
Vous souhaitez
Undefined reference est linker, et non compilateur d'erreur.
Aussi, les objets (et les archives) de fournir les symboles doivent être commandés après objets à l'aide de ces symboles lors de la liaison. Il ne peut pas d'importance ici, mais prenez l'habitude de mettre
-pthread
, pas -lpthread
. La compilation avec les pthreads soutien peut exiger plus que juste une bibliothèque. Votre plate-forme peut exiger -lrt
pour les sémaphores (avez-vous vérifiez la page de man?).Undefined reference est linker, et non compilateur d'erreur.
Aussi, les objets (et les archives) de fournir les symboles doivent être commandés après objets à l'aide de ces symboles lors de la liaison. Il ne peut pas d'importance ici, mais prenez l'habitude de mettre
-lfoo
vers le fin de la commande, pas le démarrer.OriginalL'auteur Mike | 2012-06-20
Vous devez vous connecter pour publier un commentaire.
Vous voulez l'option de compilation
-pthread
(si vous êtes vraiment en utilisant les pthreads). Si vous avez besoin de ces fonctions, elles sont enlibrt
donc utiliser-lrt
-pthread
mais pourriez-vous préciser les raisons qui l'est? et ce qui est de la différence entre-lpthread
et-pthread
? MerciSi vous regardez la page de manuel de gcc, -pthread: "Ajoute le support de multithreading avec la bibliothèque pthreads. Cette option définit les drapeaux pour le préprocesseur et l'éditeur de liens." L'exact drapeaux peuvent différer de plate-forme à plate-forme; sur votre système, il peut être quelque chose comme "-D__PTHREADS -lpthread -lrt", ce qui signifie que juste de passage "-lpthread" n'est pas suffisante. Vous pouviez comprendre exactement de quoi il s'cartes sur chaque plate-forme vous vous souciez et le passer au lieu de cela, pourquoi?
En plus de cela, certains d'autres compilateurs (je crois cpi) "gcc en mode de compatibilité" peut aussi utiliser -pthread d'influencer certains de génération de code et/ou l'optimisation des décisions, donc si vous contourner cela, vous pourriez vous retrouver avec un code qui compile et des liens mais se bloque 1 dans un million de fois...
OriginalL'auteur Ben Jackson