-lpthread опция gcc - PullRequest
       12

-lpthread опция gcc

9 голосов
/ 17 февраля 2012

Как я знаю, если я хочу использовать библиотеку pthread в среде linux, я должен включить pthread.h и скомпилировать исходный код с опцией -lpthread.Но я не понимаю, почему я должен скомпилировать с опцией -lpthread.Я думаю, что эта опция избыточна ... потому что я уже объявил включить заголовочный файл pthread.h, чтобы gcc связывал библиотеку pthread.Почему gcc не связывает файл библиотеки pthread автоматически, читая #include?

Заранее спасибо.

Ответы [ 6 ]

19 голосов
/ 17 февраля 2012

Скважина связывание и компиляция - это две отдельные фазы.

Вы включаете заголовок pthread.h, чтобы компилятор понимал типы данных и имена символов, которые вы используете в своих исходных файлах, но определены / объявлены в заголовочном файле библиотеки pthread.

Вы ссылаетесь на библиотеку pthread, используя -lpthread, чтобы компоновщик мог фактически найти эти символы в библиотеке pthread на этапе компоновки.

4 голосов
/ 17 февраля 2012

Наличие #include <pthread.h> в вашем коде не дает ссылки в библиотеке; он включает в себя только заголовок для компиляции. Это позволяет компилятору видеть различные структуры, объявления функций и т. Д. Наличие -lpthread фактически приводит к тому, что компоновщик выполняет связывание. Таким образом, include сообщает компилятору, что доступно, а -lpthread фактически позволяет программе вызывать функции в библиотеке во время выполнения.

3 голосов
/ 17 февраля 2012

Поскольку GCC не выполняет автоматическое связывание библиотек, запускаемых включением заголовка (в отличие от MSVC, или мне так сказали).

2 голосов
/ 17 февраля 2012

Заголовочный файл просто объявляет, что такое функции pthread и как их следует вызывать.-lpthread ссылки на саму библиотеку, содержащую фактические функции.

Компилятор не знает, как вы собираетесь разрешать функции в pthread.h.Возможно, вы захотите использовать статическую библиотеку, предоставляемую системой, некоторую совместимую реализацию - черт, вы можете реализовать их самостоятельно в другом исходном файле.Это зависит от компоновщика и не касается компилятора.

1 голос
/ 14 мая 2015

Заголовочный файл Pthread.h включен в программу потока posix, но вам нужно -lpthread во время компиляции, поскольку он связывает его с библиотекой pthread ПРИМЕЧАНИЕ: -lpthread -lpcap все являются переключателямис компилятором gcc, который может связать определенную библиотеку в нашем исходном коде.(lpthread означает библиотеку "link pthread")

1 голос
/ 17 февраля 2012

Включая заголовочные файлы, вы сообщаете компилятору, какие функции он будет видеть. Но если эти функции находятся во внешней библиотеке, например, функции pthread, вам необходимо связать эту библиотеку с вашей программой, чтобы она действительно могла получить доступ к этим функциям. Вот что делает -lpthread.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...