У чому відмінність gcc -pthreadі gcc -lpthreadщо використовується при складанні багатопотокових програм?
У чому відмінність gcc -pthreadі gcc -lpthreadщо використовується при складанні багатопотокових програм?
Відповіді:
-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рівномірного руху вперед.
-lpthreadдостатньо, щоб отримати всю бібліотеку ниток POSIX.
-lpthread робить отримати цілу бібліотеку потокової POSIX.
-lpthreadповинно бути достатньо, щоб отримати повну підтримку в pthreads. Інші прапори компіляції не потрібні.
-lpthreadале не -pthreadє недостатньою для отримання підтримки pthread, як я вже уточнив у своєму попередньому коментарі.
-lpthread. Однак документація gcc припускає, що цього може бути недостатньо для підтримки підтримки pthreads, про що я говорив у попередніх коментарях. Мене зовсім не цікавить, що станеться, якщо ви не надаєте -lpthreadчи якісь випадкові інші власні варіанти. Лише -lpthreadвизначено POSIX, щоб гарантувати pthreads, і це, здається, недостатньо для gcc.
-pthreadДодає підтримку багатопотокового перегляду з бібліотекою pthreads. Цей параметр встановлює прапори як для препроцесора, так і для Linker ( man gcc).
поки
-lpthread існує під час з'єднання, під час попередньої обробки не буде впливу.
Відповідь є прийнятою, але, 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не є ні необхідним, ні достатнім.