gcc: зачем нужен флаг -lm для связывания математической библиотеки?

Я только что обнаружил, что флаг -lm необходим gcc для компиляции программы, которая ссылается на функцию из математической библиотеки. Мне интересно, почему явный флаг привязки не требуется при компиляции программ, содержащих другие библиотеки, такие как библиотека времени. Если я напишу программу, в которой вызывается функция time() , она будет скомпилирована без проблем даже без ссылок. Но программа с использованием математической библиотеки просто не будет работать без флага -lm .

Может ли кто-нибудь объяснить причину такого поведения? Спасибо за ваше время.

Из-за смешной исторической практики, которую никто не хочет исправлять. Объединение всех функций, требуемых C и POSIX, в один файл библиотеки не только не позволит повторять этот вопрос снова и снова, но также будет экономить значительное количество времени и памяти при динамической компоновке, поскольку для каждого связанного файла .so требуется операции файловой системы, чтобы найти и найти его, а также несколько страниц для его статических переменных, перемещений и т. д.

Реализация, в которой все функции находятся в одной библиотеке, а параметры -lpthread , -lpthread , -lrt и т. Д. – все без-ops (или ссылка на пустые .a файлы), отлично соответствуют POSIX и, безусловно, предпочтительнее.

Примечание. Я говорю о POSIX, потому что сам C не указывает ничего о том, как вызывается компилятор. Таким образом, вы можете просто рассматривать gcc -std=c99 -lm как специфичный для реализации способ, которым должен быть вызван компилятор для обеспечения согласованного поведения.

Потому что time() и некоторые другие функции builtin в библиотеку C ( libc ), и GCC всегда ссылается на libc, если вы не используете -ffreestanding компиляции. Однако математические функции живут в libm который неявно связан gcc.

Interesting Posts

Как resize разделенных экранов emacs?

Как я могу открыть более 15 файлов одновременно в Windows 7?

Bootstrap 3 с дистанционным модулем

Как запретить Chrome Canary обновлять -OR- Как мне синхронизировать два профиля Chrome с одной учетной записью?

В чем разница между квадратными скобками и круглыми скобками в регулярном выражении?

Как я могу заставить Linux правильно интерпретировать клавиатурные символы?

Как использовать подстановочный шаблон в classpath для добавления нескольких банок?

Есть ли какое-либо решение для Process1_Initialization_Failed в Windows 7?

Java неизменяемые коллекции

Django получает доступ к полям ManyToMany из сигнала post_save

Мобильные пользователи не могут получить доступ к вкладке страницы Facebook

Могу ли я найти идентификатор сеанса для входа пользователя на другой компьютер?

Excel 2013 – «Не удается выполнить эту задачу с доступными ресурсами»

java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Как я могу получить Firefox / Chrome для доступа к веб-сайтам IPv6?

Давайте будем гением компьютера.