Різниця між -pthread і -lpthread під час компіляції


Відповіді:


116

-pthread повідомляє компілятору зв’язатись у бібліотеці pthread, а також налаштувати компіляцію для потоків.

Наприклад, нижче показано макроси, які визначаються при використанні -pthreadпараметра на пакеті GCC, встановленому на моїй машині 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

Використання цього -lpthreadпараметра спричиняє зв'язок бібліотеки pthread - попередньо визначені макроси не визначаються.

Підсумок: слід скористатися -pthreadопцією.


Примітка: -pthreadопція документально зафіксована як певна платформа в документах GCC, тому може бути не завжди доступною. Однак він доступний на платформах, для яких документи GCC не чітко перераховують його (наприклад, i386 та x86-64) - вам слід користуватися ним, коли вони доступні.

Також зауважте, що GCC використовували й інші подібні параметри, такі як -pthreads(перелічено як синонім для -pthreadSolaris 2) та -mthread(для підтримки потоків, що стосуються MinGW, для i386 та x86-64 Windows). Я розумію, що GCC намагається перейти до використання -pthreadрівномірного руху вперед.


2
Що дивно, оскільки воно прямо суперечить POSIX. POSIX наказує, що проходження -lpthreadдостатньо, щоб отримати всю бібліотеку ниток POSIX.
fuz

@FUZxxl Passing -lpthread робить отримати цілу бібліотеку потокової POSIX.
користувач253751

5
@immibis Ні, на що я маю на увазі, POSIX говорить, що посилання з ним -lpthreadповинно бути достатньо, щоб отримати повну підтримку в pthreads. Інші прапори компіляції не потрібні.
фуз

1
@alecov Що не так з gcc, це те, що компіляція, -lpthreadале не -pthreadє недостатньою для отримання підтримки pthread, як я вже уточнив у своєму попередньому коментарі.
фуз

2
@alecov POSIX наказує, що pthreads повинні працювати, якщо ви налаштуєте середовище POSIX та зв’яжетесь із ним -lpthread. Однак документація gcc припускає, що цього може бути недостатньо для підтримки підтримки pthreads, про що я говорив у попередніх коментарях. Мене зовсім не цікавить, що станеться, якщо ви не надаєте -lpthreadчи якісь випадкові інші власні варіанти. Лише -lpthreadвизначено POSIX, щоб гарантувати pthreads, і це, здається, недостатньо для gcc.
фуз

10

-pthreadДодає підтримку багатопотокового перегляду з бібліотекою pthreads. Цей параметр встановлює прапори як для препроцесора, так і для Linker ( man gcc).

поки

-lpthread існує під час з'єднання, під час попередньої обробки не буде впливу.


4

Відповідь є прийнятою, але, IMO, вона не дає достатнього контексту та розуміння. Звідси ця додаткова відповідь.


-lpthread є рішенням проблеми, яка більше не існує (з ~ 2005 р.).

За старих часів існували власні реалізації Pthreads API, які не відповідали POSIX, як LinuxThreads . Стандарт POSIX просто говорить, що якщо хочеться поведінки, сумісної з POSIX, то потрібно зв’язатись -lpthreadі зв’язати, що потрібно для з'єднання сумісної з POSIX реалізації Pthreads API, якщо його буде багато реалізацій .

Немає декількох реалізацій API Pthreads в сучасних операційних системах. І тому -lpthreadбільше не служить ніякій меті.


Такі компілятори, як gccі clang(і, мабуть, всі сумісні з Linux компілятори) вимагають використання -pthreadпараметра командного рядка як для компіляції, так і для з'єднання багатопотокових програм, сумісних з POSIX, і для цього потрібно використовувати.

Під час компіляції -pthreadпараметр виявляє, що запитується API Pthread (може бути декілька API інтерфейсу, наприклад, Solaris Threads) та визначає макроси, орієнтовані на платформу ( _REENTRANTв Linux , _MTна Solaris).

У час -pthreadпосилання посилання в потрібних бібліотеках (якщо такі є), які реалізують сумісну з POSIX поведінку API Pthreads.

Сказане чітко пояснює, чому -lpthreadне є ні необхідним, ні достатнім.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.