Date Редакция Категория comp Теги C / K&R

Сперва разберемся, за что нас отругали. 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