Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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