Quelle est la différence entre gcc -pthread
et gcc -lpthread
qui est utilisé lors de la compilation de programmes multithread?
Quelle est la différence entre gcc -pthread
et gcc -lpthread
qui est utilisé lors de la compilation de programmes multithread?
Réponses:
-pthread
indique au compilateur de créer un lien dans la bibliothèque pthread et de configurer la compilation pour les threads.
Par exemple, ce qui suit montre les macros qui sont définies lorsque l' -pthread
option est utilisée sur le package GCC installé sur ma machine Ubuntu:
$ gcc -pthread -E -dM test.c > dm.pthread.txt
$ gcc -E -dM test.c > dm.nopthread.txt
$ diff dm.pthread.txt dm.nopthread.txt
152d151
< #define _REENTRANT 1
208d206
< #define __USE_REENTRANT 1
L'utilisation de l' -lpthread
option entraîne uniquement la liaison de la bibliothèque pthread - les macros prédéfinies ne sont pas définies.
Bottom line: vous devriez utiliser l' -pthread
option.
Remarque: l' -pthread
option est documentée en tant qu'option spécifique à la plate-forme dans la documentation GCC, elle n'est donc pas toujours disponible. Cependant, il est disponible sur les plates-formes pour lesquelles la documentation GCC ne le répertorie pas explicitement (comme i386 et x86-64) - vous devriez l'utiliser lorsqu'il est disponible.
Notez également que d'autres options similaires ont été utilisées par GCC, telles que -pthreads
(répertorié comme synonyme de -pthread
sur Solaris 2) et -mthread
(pour la prise en charge des threads spécifiques à MinGW sous Windows i386 et x86-64). Je crois comprendre que GCC essaie de passer à une utilisation -pthread
uniforme à l'avenir.
-lpthread
soit suffisant pour obtenir toute la bibliothèque de threads POSIX.
-lpthread
fait obtenir toute la bibliothèque de threads POSIX.
-lpthread
devrait être suffisante pour obtenir le support complet de pthreads. Aucun autre indicateur de compilation ne devrait être nécessaire.
-lpthread
mais pas -pthread
est insuffisant pour obtenir le support de pthread, comme je l'ai déjà précisé dans mon commentaire précédent.
-lpthread
. Cependant, la documentation de gcc suggère que cela pourrait être insuffisant pour obtenir le support de pthreads, ce que j'ai souligné dans les commentaires précédents. Je ne me soucie pas du tout de ce qui se passe si vous ne fournissez pas -lpthread
ou d'autres options exclusives aléatoires. Seul -lpthread
est spécifié par POSIX pour garantir pthreads et cela ne semble pas suffisant avec gcc.
-pthread
Ajoute la prise en charge du multithreading avec la bibliothèque pthreads. Cette option définit des indicateurs pour le préprocesseur et l'éditeur de liens ( man gcc
).
tandis que
-lpthread
intervient lors de la liaison, il n'y aura aucune influence lors du prétraitement.
Il y a une réponse acceptée, mais, OMI, elle ne fournit pas suffisamment de contexte et de perspicacité. D'où cette réponse supplémentaire.
-lpthread
est une solution à un problème qui n'existe plus (depuis ~ 2005).
Dans l'ancien temps, il y avait des implémentations propriétaires de l' API Pthreads qui n'étaient pas compatibles POSIX, comme LinuxThreads . La norme POSIX dit simplement que si l'on veut un comportement conforme à POSIX, alors il faut établir un lien avec -lpthread
une implémentation compatible POSIX de l'API Pthreads, et la liaison qui est nécessaire pour lier une implémentation conforme à POSIX de l'API Pthreads, s'il y en a de nombreuses implémentations .
Il n'y a pas d'implémentations multiples de l'API Pthreads dans les systèmes d'exploitation modernes. Et c'est pourquoi -lpthread
ne sert plus aucun but.
Les compilateurs comme gcc
et clang
(et, probablement, tous les compilateurs compatibles Linux) nécessitent l' utilisation -pthread
de l'option de ligne de commande pour à la fois compiler et relier des applications multithreads compatibles POSIX et c'est ce qu'il faut utiliser.
Au moment de la compilation, l' -pthread
option indique que l'API Pthread est demandée (il peut y avoir plusieurs API de thread, par exemple Solaris Threads) et définit des macros spécifiques à la plate-forme ( _REENTRANT
sous Linux ,_MT
sous Solaris).
Au moment de la liaison, -pthread
liens dans les bibliothèques requises (le cas échéant) qui implémentent le comportement d'API Pthreads compatible POSIX.
Ce qui précède montre clairement pourquoi -lpthread
n'est ni nécessaire ni suffisant.