Вы указываете компилятору искать определенные библиотеки и использовать их для создания окончательного объектного файла.
Когда вы выполняли свой потоковый код, вы использовали потоковые примитивы. Эти примитивы потоков реализованы в библиотеке с именем pthread
, -lpthread
указывает компоновщику использовать библиотеку pthread
, без предоставления этого переключателя компилятор не сможет создать действительный объектный файл, так как отсутствует реализация кода потоков .
В файловой системе библиотеки можно найти в / usr / lib и lib (среди прочих), когда вы посмотрите в эти каталоги, вы увидите, что файлы начинаются с префикса lib
. например libpthreadxxxxxx
. Вам нужно будет провести собственное исследование, чтобы выяснить, что означает хххх.
Цикл разработки с использованием инструментов в стиле Unix очень гранулированный на первый взгляд: когда вы используете тяжеловесные IDE (читай: visual studiio для C ++), IDE неявно связывается с нагрузками стандартных библиотек, поэтому часто вам не нужно предоставлять название библиотек, которые вы обычно будете использовать. Однако, когда вы начнете заниматься более сложным программированием, вам, вероятно, придется установить и настроить IDE для использования внешних библиотек кода. Если бы вы использовали потоковые примитивы в visual studio, вам, скорее всего, не нужно будет предоставлять компилятору информацию о том, где искать потоковые примитивы, Microsoft считает это общей библиотекой, и каждый новый проект будет ссылаться на нее неявно.
Небольшое обсуждение GCC
GCC - очень разнообразный компилятор, создающий код для различных сценариев использования. Как таковые они стараются быть нейтральными и не делают предположений. Например, pthread - это конкретная реализация потоковых примитивов. Тем не менее, даже сейчас, по крайней мере, в Linux он является стандартом де-факто, но не единственным. Другие реализации Unix имели другую реализацию. Когда такой выбор существует, разработчики компилятора не справедливо неявно ссылаются на библиотеки. Однако они неявно ссылаются на стандартные библиотеки; например, G ++ - это просто команда-оболочка для внутреннего кода компилятора, это интерфейс C ++, поэтому он неявно ссылается на реализацию стандартной библиотеки C ++. Точно так же интерфейс C связывается со стандартной библиотекой C.
Люди часто не хотят использовать определенную реализацию стандартной библиотеки, и вместо этого они могут захотеть использовать другую реализацию, в таких случаях вы должны явным образом сообщить компилятору об использовании предоставленной вами реализации. Такие варианты использования очень детализированы и являются проблемами поверхностного уровня в G ++. В Visual Studio вам пришлось бы много повозиться, чтобы внести такие изменения в целом, поскольку это уже не ожидаемый вариант использования.
Википедия предоставит вам больше информации .
Редактировать: Я исправлю орфографические и грамматические проблемы позже: D