Сперва разберемся, за что нас отругали. Undefined reference
означает ссылку на функцию, которая не определена. В данном случае gcc
не нашел определения функции pow
. Где же их найти?
Как уже говорилось раньше, определения функций могут находиться в библиотеках. Это скомпилированные двоичные файлы, содержащие коллекции однотипных операций, которые обычно располагаются в каталогах /usr/lib
и /usr/local/lib
. Если библиотечный файл имеет расширение .a
, то это статическая библиотека, то есть при компоновке весь ее двоичный код включается в исполняемый файл. Если расширение .so
, то это динамическая библиотека. Это значит в исполняемый файл программы помещается только ссылка на библиотечный файл, а уже из него и запускается функция.
Когда мы использовали функцию printf
для вывода информации, мы тоже ее нигде не писали, а использовали stdio.h
. Откуда же она вызывается?
Просто при компоновке любой программы компилятор gcc по умолчанию включает в запускаемый файл библиотеку libc
. Это стандартная библиотека языка C. Она содержит рутинные функции, необходимые абсолютно во всех программах, написанных на C, в том числе и функцию printf
. Поскольку библиотека libc
нужна во всех программах, она включается по умолчанию, без необходимости давать отдельное указание на ее включение.
Остальные библиотеки надо требовать включать явно, ведь нельзя же помещать в каждую программу все существующие библиотеки. Нужно подключать только то, что реально необходимо.
Нам в данном случае нужна библиотека libm
. Именно она содержит все основные математические функции. Она требует включения в текст программы заголовочного файла <math.h>
.
Помимо этого дистрибутивы Linux содержат и другие библиотеки, например:
- libGL. Вывод трёхмерной графики в стандарте OpenGL. Требуется заголовочный файл
GL/gl.h
. - libcrypt. Криптографические функции. Требуется заголовочный файл
crypt.h
. - libcurses. Псевдографика в символьном режиме. Требуется заголовочный файл
curses.h
. - libform. Создание экранных форм в текстовом режиме. Требуется заголовочный файл
form.h
. - libgthread. Поддержка многопоточного режима. Требуется заголовочный файл
glib.h
. - libgtk. Графическая библиотека в режиме X Window. Требуется заголовочный файл
gtk/gtk.h
. - libhistory. Работы с журналами. Требуется заголовочный файл
readline/readline.h
. - libjpeg. Работа с изображениям в формате JPEG. Требуется заголовочный файл
jpeglib.h
. - libncurses. Работа с псевдографикой в символьном режиме. Требуется заголовочный файл
ncurses.h
. - libpng. Работа с графикой в формате PNG. Требуется заголовочный файл
png.h
. - libpthread. Многопоточная библиотека POSIX. Стандартная многопоточная библиотека для Linux. Требуется заголовочный файл
pthread.h
. - libreadline. Работа с командной строкой. Требуется заголовочный файл
readline/readline.h
. - libtiff. Работа с графикой в формате TIFF. Требуется заголовочный файл
tiffio.h
. - libvga. Низкоуровневая работа с VGA и SVGA. Требуется заголовочный файл
vga.h
. - …
и многие другие.
Обратите внимание, что названия всех этих библиотек начинаются с буквосочетания lib
. Для их явного включения в исполняемый файл, нужно добавить к команде gcc
опцию -l
(искать дополнительную библиотеку), к которой слитно прибавить название библиотеки без lib
. Например, чтобы включить библиотеку libvga
надо указать опцию -lvga
.
Нам нужна математическая функция pow
, которая находится в математической библиотеке libm
. Следовательно, чтобы подключить эту библиотеку, мы должны указать опцию -lm
.
Комментарии
comments powered by Disqus