Чтение онлайн

на главную - закладки

Жанры

Программирование для 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
:

% ldd tifftest

 libtiff.so.3 => /usr/lib/libtiff.so.3 (0x4001d000)

 libc.so.6 => /lib/libc.so.6 (0x40060000)

 libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x40155000)

 libz.so.1 => /usr/lib/libz.so.1 (0x40174000)

 /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

В противоположность этому статические библиотеки не могут указывать на другие библиотеки. Если попытаться подключить к программе статическую версию библиотеки

libtiff
, указав в командной строке опцию
– static
, компоновщик столкнется с нераспознаваемыми символическими константами:

% gcc -static -о tifftest tifftest.с -ltiff

/usr/bin/../lib/libtiff.a(tif_jpeg.o): In function

'TIFFjpeg_error_exit':

tif_jpeg.о(.text+0x2a): undefined reference to 'jpeg_abort'

/usr/bin/../lib/libtiff.a (tif_jpeg.o): In function

'TIFFjpeg_create_compress':

tif_jpeg.o(.text+0x8d): undefined reference to 'jpeg_std_error'

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

Черный дембель. Часть 2

Федин Андрей Анатольевич
2. Черный дембель
Фантастика:
попаданцы
альтернативная история
4.25
рейтинг книги
Черный дембель. Часть 2

Кодекс Крови. Книга ХIV

Борзых М.
14. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХIV

Магия чистых душ 3

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Магия чистых душ 3

Жестокая свадьба

Тоцка Тала
Любовные романы:
современные любовные романы
4.87
рейтинг книги
Жестокая свадьба

Усадьба леди Анны

Ром Полина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Усадьба леди Анны

Измена. Возвращение любви!

Леманн Анастасия
3. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Возвращение любви!

Два лика Ирэн

Ром Полина
Любовные романы:
любовно-фантастические романы
6.08
рейтинг книги
Два лика Ирэн

Опасная любовь командора

Муратова Ульяна
1. Проклятые луной
Фантастика:
фэнтези
5.00
рейтинг книги
Опасная любовь командора

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

Мымра!

Фад Диана
1. Мымрики
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Мымра!

Таня Гроттер и магический контрабас

Емец Дмитрий Александрович
1. Таня Гроттер
Фантастика:
фэнтези
8.52
рейтинг книги
Таня Гроттер и магический контрабас

Имперский Курьер

Бо Вова
1. Запечатанный мир
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Имперский Курьер

Страж. Тетралогия

Пехов Алексей Юрьевич
Страж
Фантастика:
фэнтези
9.11
рейтинг книги
Страж. Тетралогия

Сердце дракона. Танец с врагом

Серганова Татьяна
2. Танец с врагом
Любовные романы:
любовно-фантастические романы
5.25
рейтинг книги
Сердце дракона. Танец с врагом