Différence entre -pthread et -lpthread lors de la compilation

Réponses:

116

-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' -pthreadoption 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' -lpthreadoption 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' -pthreadoption.


Remarque: l' -pthreadoption 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 -pthreadsur 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 -pthreaduniforme à l'avenir.

Michael Burr
la source
2
Ce qui est étrange car cela contredit directement POSIX. POSIX exige que le passage -lpthreadsoit suffisant pour obtenir toute la bibliothèque de threads POSIX.
fuz le
@FUZxxl Passing -lpthread fait obtenir toute la bibliothèque de threads POSIX.
user253751
5
@immibis Non, ce que je veux dire, c'est que POSIX dit que la liaison avec -lpthreaddevrait être suffisante pour obtenir le support complet de pthreads. Aucun autre indicateur de compilation ne devrait être nécessaire.
fuz le
1
@alecov Ce qui ne va pas avec gcc, c'est que compiler avec -lpthreadmais pas -pthreadest insuffisant pour obtenir le support de pthread, comme je l'ai déjà précisé dans mon commentaire précédent.
fuz
2
@alecov POSIX exige que pthreads fonctionne si vous configurez un environnement POSIX et établissez un lien avec -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 -lpthreadou d'autres options exclusives aléatoires. Seul -lpthreadest spécifié par POSIX pour garantir pthreads et cela ne semble pas suffisant avec gcc.
fuz
10

-pthreadAjoute 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.

Praveen Kumar
la source
4

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 -lpthreadune 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 -lpthreadne sert plus aucun but.


Les compilateurs comme gccet clang(et, probablement, tous les compilateurs compatibles Linux) nécessitent l' utilisation -pthreadde 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' -pthreadoption 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 ( _REENTRANTsous 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 -lpthreadn'est ni nécessaire ni suffisant.

Maxim Egorushkin
la source