Поддержка нескольких версий Boost в пакете Debian
Я пытаюсь создать пакет debian для моего проекта, но у меня возникли проблемы с поддержкой улучшенной версии.
Я действительно посмотрел на этот вопрос. Это похоже на то, но предоставленные решения (Build-Depends) на самом деле не применимы ко мне, так как я делаю бинарный установщик.
По сути, мои установленные библиотеки и исполняемые файлы всегда ссылаются на libboost_(компонент).so.1.46 вместо библиотеки символьных ссылок libboost_(компонент).so. Оставлять мой установщик Debian только для людей с моей точной надстройкой. Я использую CPack для создания пакета debian, и моя строка зависимости выглядит так:
SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libboost-dev (>= 1.46),
libboost-thread-dev (>= 1.46),
libboost-signals-dev (>= 1.46),
libboost-system-dev (>= 1.46),
libboost-filesystem-dev (>= 1.46),
libboost-python-dev (>= 1.46), ..." )
Нужно ли создавать отдельные установщики для каждой платформы на указанной платформе или с буст-версией этой платформы?
2 ответа
Хотя я понимаю, что вы хотите создать пакет, который будет работать со всеми буст-версиями, вы действительно должны спросить себя, возможно ли это на самом деле.
идея .so
версии (например, .so.1.46
против .so.1.48
) действительно означает, что интерфейс библиотеки (ABI) изменился, что в основном указывает на несовместимость библиотек.
следовательно, крайне маловероятно, что ваше приложение ссылается на libboost_foo.so.1.46
будет на самом деле работать с libboost_foo.so.1.48
, вполне возможно, что символы, необходимые вашему приложению, внезапно исчезли (поэтому ваше приложение откажется запускаться). хуже всего то, что значение символа менялось между версиями, что приводило к трудностям в отслеживании неопределенного поведения.
это причина, почему всякий раз, когда вы ссылаетесь на libfoo.so
двоичный код действительно связывает libfoo.so.1
(или где угодно libfoo.so
действительно очки)
Теперь политика Debian заключается в том, что имя пакета должно меняться при любом несовместимом изменении ABI. это в основном позволяет пользователю одновременно устанавливать две версии одной и той же библиотеки (например, boost-1.46 и boost-1.49).
если вы нацелены на конкретную версию Debian, вы можете быть уверены, что определенная версия библиотеки будет доступна. например, на Debian/wheezy у вас будет boost-1.49. так что, если вы предоставляете пакеты для Debian/wheezy, вам нужно всего лишь ссылаться на boost-1.49. это также одна из причин, почему релизы так хороши: это своего рода гарантия того, что все необходимые библиотеки доступны.
это также означает, что вы можете иметь разные версии пакетов одного и того же приложения в нескольких выпусках Debian, даже если не было "восходящего" выпуска: пакеты пришлось перестраивать из-за обновления (включая изменение сонама) зависимости
Итак, сделаем вывод:
ссылка на актуальную версию библиотеки - это функция, позволяющая сохранить вашу систему в здравом уме
Debian позволяет устанавливать несколько версий одной и той же библиотеки одновременно.
Решение вашей проблемы:
- предоставить бинарные пакеты для каждого выпуска soname любой зависимости
предоставление пакетов для каждого выпуска Debian сделает это намного менее хлопотным, чем кажется (поскольку каждый выпуск имеет только фиксированный набор библиотек).
Что вы можете попытаться сделать, так это статически увеличить пакеты ссылок:
установлено (Boost_USE_STATIC_LIBS ON)