Вход/Регистрация
Программирование для Linux. Профессиональный подход
вернуться

Самьюэл Алекс

Шрифт:

Затем следует объединить объектные файлы в библиотеку:

% gcc -shared -fPIC -о libtest.so test1.o test2.o

Опция

– shared
заставляет компоновщик создать совместно используемую библиотеку, а не обычный исполняемый файл. Такие библиотеки имеют расширение
.so
. Подобно статическому архиву, имя библиотеки всегда начинается с префикса
lib
, указывающего на то. что файл является библиотекой.

Компоновка совместно используемой библиотеки аналогична компоновке архива. Например, следующая команда подключает к программе файл

libtest.so
, если он находится в текущем каталоге или одном из стандартных системных библиотечных каталогов:

% gcc -о app арр.о -L. ltest

Предположим, имеются оба файла:

libtest.а
и
libtest.so
. Каким образом компоновщик принимает решение? Он просматривает каждый заданный каталог (сначала те, что указаны в опции
– L
, затем стандартные) и, как только обнаруживает хотя бы один из файлов, тут же прекращает поиск. Если в найденном каталоге присутствует только один из файлов, он и выбирается. В противном случае выбор делается в пользу совместно используемой библиотеки, если явно не указано обратное. Отдать приоритет статическому архиву позволяет опция
– static
. Например, следующая команда подключит к программе архив
libtest.a
, даже если присутствует библиотека
libtest.so
:

% gcc -static -о app арр.о -L.
– ltest

Команда

ldd
выводит список совместно используемых библиотек, подключенных к заданному исполняемому файлу. Все они должны быть доступны при запуске программы. Обратите внимание на то, что команда
ldd
сообщает о наличии дополнительной библиотеки:
ld-linux.so
. Она является частью механизма динамической компоновки в Linux.

Переменная LD_LIBRARY_PATH

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

/lib
и
/usr/lib
. Если библиотека находится в другом каталоге, она не будет найдена и система откажется загружать программу.

Одно из решений заключается в компоновке программы с указанием флага

– Wl,-rpath
:

% gcc -о app арр.о -L.
– ltest -Wl,-rpath,/usr/local/lib

Теперь в случае запуска программы

app
система будет искать требуемые библиотеки также в каталоге
/usr/local/lib
.

Но есть и другое решение: устанавливать переменную

LD_LIBRARY_PATH
при запуске программы. Подобно переменной среды
PATH
, переменная
LD_LIBRARY_PATH
представляет собой разделенный двоеточиями список каталогов. Если, к примеру, она равна
/usr/local/lib:/opt/lib
, то каталоги
/usr/local/lib
и
/opt/lib
будут просматриваться перед стандартными каталогами
/lib
и
/usr/lib
. Необходимо также учитывать, что при наличии данной переменной компоновщик будет просматривать заданные в ней каталоги, обнаруживая опцию
– L
в командной строке. [9]

9

Иногда в документации упоминается переменная

LD_RUN_PATH
. Не верьте прочитанному! Данная переменная никак не используется в Linux.

2.3.3. Стандартные библиотеки

Даже если при компоновке программы не были заданы библиотеки, все равно одна из них почти наверняка присутствует. Дело в том, что компилятор

gcc
автоматически подключает к программе стандартную библиотеку языка С:
libc
. В нее, однако, не входят математические функции. Они находятся в отдельной библиотеке,
libm
, которую нужно компоновать явно. Например, чтобы скомпилировать и скомпоновать программу
compute
, использующую тригонометрические функции (такие как
sin
и
cos
), необходимо задать следующую команду:

% gcc -о compute compute.c -lm

При компоновке программ, написанных на C++, компилятор

c++
или
g++
автоматически подключает к ним стандартную библиотек языка C++:
libstdc++
.

2.3.4. Зависимости между библиотеками

Библиотеки часто связаны одна с другой. Например, во многих Linux-системах есть библиотека

libtiff
, содержащая функции чтения и записи графических файлов формата TIFF. Она, в свою очередь, использует библиотеки
libjpeg
(подпрограммы обработки JPEG-изображений) и
libz
(подпрограммы сжатия).

В листинге 2.9 показана небольшая программа, использующая функции библиотеки

libtiff
для работы с TIFF-файлом.

Листинг 2.9. (tifftest.c) Применение библиотеки
libtiff

#include <stdio.h>

#include <tiffio.h>

int main(int argc, char** argv) {

 TIFF* tiff;

 tiff = TIFFOpen(argv[1], "r");

 TIFFClose(tiff);

 return 0;

}

При компиляции этого файла необходимо указать флаг

– ltiff
:

% gcc -о tifftest tifftest.c -ltiff

По умолчанию будет скомпонована совместно используемая версия библиотеки:

/usr/lib/libtiff.so
. В связи с тем что она обращается к библиотекам
libjpeg
и
libz
(одна совместно используемая библиотека может ссылаться на другие аналогичные библиотеки, от которых она зависит), будут также подключены их совместно используемые версии. Чтобы проверить это, воспользуемся командой
ldd
:

  • Читать дальше
  • 1
  • ...
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: