Почему в компиляторе Linux мы должны давать дополнительные аргументы при компиляции и запуске программ на C? - PullRequest
0 голосов
/ 03 августа 2011

Я реализовал семафоры в Linux в прошлом году.Но для этого мне нужно использовать -lpthread .

Теперь, когда я реализовал функцию log10 () в C, я просмотрел ИНТЕРНЕТ и увидел, что должен использовать -lm .

Я хочу знать, почему такие аргументы командной строки необходимы в Linux. И это правило ориентировано на компилятор?

(В компиляторе Windows Turboc я никогда не использовал подобные аргументы.)

Ответы [ 4 ]

1 голос
/ 03 августа 2011

Потому что по умолчанию gcc только ссылки библиотека C (libc), которая содержит известные функции printf, scanf и многие другие.

log10 существует в другой библиотеке с именем libm, поэтому вам нужно явно указать gcc , чтобы связать эту библиотеку с -lm. Та же логика применима к -lpthread.

1 голос
/ 03 августа 2011

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

Когда вы выполняли свой потоковый код, вы использовали потоковые примитивы. Эти примитивы потоков реализованы в библиотеке с именем 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

1 голос
/ 03 августа 2011

Опция -l указывает gcc, какие библиотеки необходимо использовать для компоновки.-lpthread означает «использовать библиотеку pthread», а -lm означает «использовать библиотеку m», то есть библиотеку математики.Эти команды относятся к gcc, а не к linux.

0 голосов
/ 04 августа 2011

Это чисто отсталая, вредная практика.Разделение частей стандартной библиотеки на отдельные файлы .so только увеличивает время загрузки и использование памяти.Удачи в том, чтобы кто-нибудь изменил это ... Просто примите, что вы должны это сделать (и что POSIX специально разрешает, но не требует, чтобы реализация требовала -lm для использования математических функций и -lpthread для использования потокови т. д.) и перейдем к более важным вещам.

Или, расскажите об этом Дрэпперу в системе отслеживания ошибок glibc / в списке рассылки.Он не передумает, но если вам нравятся огненные войны, вы можете получить несколько ударов ...

...