libtool
Инструмент GNU для создания переносимых библиотек на различных Unix-подобных платформах. Он абстрагирует процесс сборки статических (static) и разделяемых (shared) библиотек, скрывая платформо-зависимые особенности компиляторов, линкеров и систем сборки. libtool предоставляет единообразный интерфейс для работы с библиотеками, что упрощает создание кроссплатформенного программного обеспечения.
Особенности
- абстрагирование платформо-зависимых особенностей сборки статических и разделяемых библиотек;
- поддержка создания плагинов и модулей, загружаемых во время выполнения;
- автоматическая обработка зависимостей и путей для динамической линковки;
- возможность сборки библиотек для кросс-компиляции.
Основные компоненты
libtool состоит из нескольких ключевых компонентов, которые совместно обеспечивают создание и управление переносимыми библиотеками (подробнее с документацией можно ознакомиться здесь).
Абстракция сборки библиотек
Основная задача libtool — предоставить единообразный интерфейс для сборки библиотек, скрывая различия между компиляторами и платформами. Для этого libtool заменяет стандартные команды компилятора и линкера (например, gcc, ar, ld) своими обёртками.
Ключевые команды:
libtool --mode=compile— компиляция исходного кода в объектные файлы с поддержкой libtool;libtool --mode=link— линковка объектных файлов в библиотеку (статическую или разделяемую);libtool --mode=install— установка библиотек с правильными разрешениями и путями;libtool --mode=uninstall— удаление установленных библиотек;libtool --mode=execute— запуск программ, связанных с библиотеками libtool.
Управление версиями библиотек
libtool предоставляет систему версионирования библиотек, которая позволяет управлять совместимостью между разными версиями. Эта система основана на трех числах: текущий (current), ревизия (revision) и возраст (age).
Правила версионирования:
- Текущий интерфейс (current): увеличивается при добавлении новых функций или изменении интерфейса;
- Ревизия (revision): увеличивается при обратно совместимых изменениях;
- Возраст (age): разница между самой новой и самой старой обратно совместимой версией;
- Автоматическая генерация номеров версий для разделяемых библиотек.
Работа со статическими и разделяемыми библиотеками
libtool управляет созданием как статических, так и разделяемых библиотек в зависимости от платформы и настроек. Он автоматически определяет, какие типы библиотек поддерживаются целевой платформой.
Особенности поддержки библиотек:
- Создание статических библиотек через обёртки над
arиranlib; - Создание разделяемых библиотек с правильными флагами компилятора и линкера;
- Генерация файлов
.la(libtool archive), которые содержат метаданные о библиотеке; - Обработка зависимостей между библиотеками во время линковки;
- Поддержка weak symbols и других расширенных возможностей линковки.
Портативные плагины и модули
Библиотека libtool предоставляет механизмы для создания плагинов и модулей, которые могут быть загружены во время выполнения (dlopen). Это особенно полезно для приложений с расширяемой архитектурой.
Функции для плагинов:
libtool --mode=linkс флагом-moduleдля создания загружаемых модулей;- Поддержка автоматического разрешения зависимостей для плагинов;
- Управление путями поиска библиотек во время выполнения;
- Интеграция с системами загрузки плагинов (например,
libltdl).
Управление зависимостями и путями
libtool автоматически управляет зависимостями между библиотеками и обеспечивает правильные пути для динамической линковки как во время сборки, так и во время выполнения.
Механизмы управления зависимостями:
- Автоматическое добавление
-rpathпри линковке разделяемых библиотек; - Генерация правильных путей установки в файлах
.la; - Обработка transitive dependencies (зависимости зависимостей);
- Поддержка относительных путей для сборки out-of-tree.