Разница между -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 Передача -lpthread действительно получает всю библиотеку потоков POSIX.
user253751

5
@immibis Нет, я имею в виду, что POSIX говорит, что связывания с -lpthreadдолжно быть достаточно, чтобы получить полную поддержку pthreads. Никаких других флагов компиляции не требуется.
fuz

1
@alecov Что не так с gcc, так это то, что компиляция с использованием, -lpthreadно не -pthreadнедостаточна для получения поддержки pthread, как я уже пояснил в своем предыдущем комментарии.
fuz 08

2
@alecov POSIX требует, чтобы потоки pthread работали, если вы настраиваете среду POSIX и связываетесь с -lpthread. Однако документация gcc предполагает, что этого может быть недостаточно для поддержки pthreads, о чем я и говорил в предыдущих комментариях. Меня совершенно не волнует, что произойдет, если вы не предоставите -lpthreadкакие-либо другие проприетарные опции. Только -lpthreadуказано в POSIX для гарантии pthreads, а с gcc этого недостаточно.
fuz 08

10

-pthreadДобавляет поддержку многопоточности с библиотекой pthreads. Эта опция устанавливает флаги как для препроцессора, так и для компоновщика ( man gcc).

пока

-lpthread существует во время связывания, во время предварительной обработки не будет никакого влияния.


4

Есть принятый ответ, но, ИМО, он не дает достаточного контекста и понимания. Отсюда этот дополнительный ответ.


-lpthread это решение проблемы, которой больше не существует (с ~ 2005 г.).

Раньше существовали проприетарные реализации Pthreads API , которые не были совместимы с POSIX, например LinuxThreads . Стандарт POSIX просто говорит, что если кто-то хочет POSIX-совместимого поведения, то он должен связываться с -lpthreadPOSIX-совместимой реализацией Pthreads API и связываться с ней, если будет много его реализаций .

В современных операционных системах нет множественных реализаций API Pthreads. И поэтому -lpthreadбольше не служит никакой цели.


Такие компиляторы, как gccand clang(и, вероятно, все Linux-совместимые компиляторы) требуют использования параметра -pthreadкомандной строки как для компиляции, так и для компоновки POSIX-совместимых многопоточных приложений, и это то, что нужно использовать.

Во время компиляции -pthreadопция показывает, что запрошен Pthread API (может быть несколько потоковых API, например, Solaris Threads) и определяет макросы для конкретной платформы ( _REENTRANTв Linux , _MTв Solaris).

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

Из вышесказанного ясно, почему -lpthreadэто не является ни необходимым, ни достаточным.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.