GNU Libtool

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 15:37, 9 марта 2017.
GNU Libtool
Libtool.jpg
Разработчики: GNU Project
Выпущена: 9 июля 1997 года
Постоянный выпуск: 2.4.6 / 15 февраля 2015 года
Операционная система: кроссплатформенное программное обеспечение
Тип ПО: инструментальное программное обеспечение
Лицензия: GNU GPL v2
Веб-сайт gnu.org/software/libtool/

GNU Libtool — это сценарий поддержки общих библиотек. Libtool скрывает всю сложность использования разделяемых библиотек за согласованным и переносимым интерфейсом и управляет созданием статических и динамических библиотек на разных UNIX-подобных операционных системах.

Пакет GNU Libtool является частью системы сборки GNU.

Описание

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

GNU Libtool позволяет упростить данный процесс посредством инкапсуляции особенностей конкретной платформы и пользовательского интерфейса в одном сценарии. Libtool разработана таким образом, что вся функциональность предоставляется через обобщенный интерфейс, но некоторые особенности, которые могут привести к нежелательным последствиям, скрыты от разработчика.

Используя согласованный интерфейс утилиты Libtool, пользователям предстоит запустить только конфигурационный сценарий (или его эквивалент), чтобы пакет с исходным кодом произвел сборку разделяемых библиотек, всю остальную работу выполняет Libtool.

История разработки Libtool

Начиная с 1995 года, некоторые разработчики проекта GNU стали осознавать важность наличия поддержки разделяемых библиотек в своих приложениях. Основными причинами такого решения стали модульность и повторное (многократное, а не copy-paste[1]) использование кода [2] в программах GNU.

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

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

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

По этой причине была разработана утилита Libtool как независимый shell-сценарий[3]. Она позволяет решить проблемы и противоречия, с которыми сталкиваются разработчики make-файлов[4] при сборке библиотек, благодаря согласованному и многофункциональному интерфейсу.

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

  1. Простота использования.
  2. Интеграция с утилитами GNU Autoconf и GNU Automake и наличие собственного независимого от них функционала.
  3. Переносимость на другие (не GNU) платформы.

Основы использования GNU Libtool

Установка Libtool

Последнюю версию пакета Libtool можно загрузить с веб-сайта проекта GNU Libtool.

Для того, чтобы использовать Libtool, необходимо включить в проект следующие файлы:

config.guess — определяет каноническое имя типа системы.
config.sub — сценарий проверки канонического имени системы.
install-sh — сценарий установки.
ltmain.sh — общий сценарий, реализующий основную функциональность Libtool.

Команда libtool

Чтобы начать работу с утилитой Libtool, нужно воспользоваться командой следующего вида:

libtool [options] ... [mode-arg] ...

Данная команда может сопровождаться следующими параметрами:

--config — отображение переменных конфигурации.
--debug — перенаправление результатов трассировки сценария в стандартный поток вывода.
-n, --dry-run — отображение действий, которые выполнит команда libtool, без создания, изменения и удаления файлов.
--features — отображение основных параметров конфигурации; позволяет определить тип создаваемой библиотеки.
--finish — то же самое, что и –mode=finish.
-h, --help и --help-all — получение справочной информации.
--mode=mode — используйте mode для задания типа операции, где mode может принимать одно из следующих значений:
сompile — собрать из исходного файла libtool-объект;
execute — автоматически установить путь к библиотеке;
link — создать библиотеку или исполняемый модуль;
install — установить библиотеку или исполняемый модуль;
finish — завершить установку libtool-библиотек;
uninstall — удалить установленные библиотеки или исполняемые модули;
clean — удалить неустановленные библиотеки или исполняемые модули.
--tag=tag — использование переменных конфигурации с тегом tag.
--preserve-dup-deps — не устранять взаимозависимости дубликатов в библиотеках.
--quite или --silent — не отображать никаких результатов или информационных сообщений.
-v или --verbose — показать результаты и информационные сообщения, включая те, которые не выводятся по умолчанию.
--no-verbose — не показывать никакой дополнительной информации, кроме той, которая выводится по умолчанию.
--version — отображение версии утилиты Libtool.

Libtool-библиотека

Libtool создает так называемые Libtool-библиотеки из Libtool-объектов: файл с расширением .loPIC[5]-объект для динамических библиотек, и файл с расширением .onon-PIC-объект для статических библиотек. Из этих файлов выбирается один, который будет использован при компоновке исполняемых файлов и библиотек определенного типа.

Libtool-библиотеки — это целый набор файлов. Главный файл, содержащий описание библиотеки, имеет расширение .la. Объектные файлы, используемые при компиляции, а также результирующие статические и динамические библиотеки, помещаются в подкаталог .libs/. При установке Libtool автоматически обрабатывает эти файлы, помещая их в нужные каталоги.

Для демонстрации использования утилиты Libtool рассмотрим файл hello.c:

#include <stdio.h>

void hello(char *who)
{
    printf("Hello, %s!\n", who);
}

Пример создания динамической библиотеки

Стоит отметить, что некоторые операционные системы не поддерживают динамических библиотек — Libtool автоматически будет создавать при этом только статические библиотеки.

$ libtool gcc -c hello.c
mkdir .libs
gcc -c  -fPIC -DPIC hello.c -o .libs/hello.lo
gcc -c hello.c -o hello.o >/dev/null 2>&1
mv -f .libs/hello.lo hello.lo
$ ls
hello.c   hello.lo   hello.o
$ libtool gcc -rpath /usr/local/lib -o libhello.la hello.lo
rm -fr .libs/libhello.la .libs/libhello.* .libs/libhello.*
/opt/gcc-lib/hp821/2.7.0/ld -b +h libhello.sl.0 +b /usr/local/lib \
-o .libs/libhello.sl.0.0  hello.lo
(cd .libs && rm -f libhello.sl.0 && ln -s libhello.sl.0.0 libhello.sl.0)
(cd .libs && rm -f libhello.sl && ln -s libhello.sl.0.0 libhello.sl)
ar cru .libs/libhello.a  hello.o
ranlib .libs/libhello.a
creating libhello.la
(cd .libs && rm -f libhello.la && ln -s ../libhello.la libhello.la)
$ ls
hello.c   hello.lo   hello.o   libhello.la

Пример создания статической библиотеки

Libtool создаст статическую библиотеку, если использовать параметр -static или all-static:

$ libtool gcc -static -o libhello.la hello.lo
rm -fr .libs/libhello.la .libs/libhello.* .libs/libhello.*
ar cru .libs/libhello.a  hello.o
ranlib .libs/libhello.a
creating libhello.la
(cd .libs && rm -f libhello.la && ln -s ../libhello.la libhello.la)

Примечания

Литература

Calcote, John (July 2010). Autotools : a practitioner's guide to GNU Autoconf, Automake, and Libtool / by John Calcote (in english). No Starch Press. pp. 145 – 170. ISBN 978-1-59327-206-7. 

Ссылки