Создайте одну статическую (удобную?) Библиотеку с Autotools и несколькими каталогами сборки - PullRequest
1 голос
/ 07 декабря 2011

Я поддерживаю проект библиотеки, который создает библиотеку «переднего плана» и несколько библиотек «внутреннего интерфейса».В проекте используется пакет Autotools (который я изучаю и считаю, что реализация нашего проекта нуждается в обслуживании), включая Libtool.В качестве разделяемых библиотек все это работает очень хорошо.У нас есть разработчик приложений, который использует библиотеку и предпочитает создавать статические библиотеки для облегчения его распространения программного обеспечения на несколько платформ (я не хочу обсуждать его мотивы).

Он сказал мне, что напредыдущий пункт он смог собрать одну большую статическую библиотеку, используя нашу систему сборки, но больше не мог.Я не смог точно отследить, когда это произошло, но подозреваю, что это может быть связано с одним из двух изменений.Первым изменением было удаление связанного исходного каталога libtool.Вторым было размещение внутренних библиотек в / usr / local / lib / project, а не разбрасывание их, как раньше, в / usr / local / lib (расположение по умолчанию).

То, что я не смог узнать, это какобъединить библиотеку фронтэнда с бэкэндами в одну удобную библиотеку в / usr / local / lib и сделать это в рамках Autotools.Это кажется возможным, но я не нашел примера, на котором можно было бы поучиться.

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

1 Ответ

2 голосов
/ 08 декабря 2011

В жаргоне Libtool удобная библиотека - это библиотека, которая не установлена. Он должен быть объявлен Automake с префиксом noinst_.

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

Я предполагаю, что у вас есть третье изменение: возможно, в прошлом все ваши бэкэнд-библиотеки были удобными (то есть noinst_) библиотеками, поэтому вы эффективно устанавливали только одну .so и одну .a в конечном итоге; Тем не менее, в какой-то момент было решено установить все эти внутренние библиотеки самостоятельно (т.е. изменить noinst_ на pkglib_ или аналогичный), поэтому эти библиотеки перестали быть вспомогательными библиотеками и больше не включаются в интерфейс.

Обратите внимание, что если установленные библиотеки бэкэнда по-прежнему указаны как _LIBADD для библиотеки веб-интерфейса, эта зависимость по-прежнему записывается Libtool. Всякий раз, когда вы ссылаетесь на установленный файл frontend.la (для этого необходимо использовать libtool для связи даже в качестве пользователя библиотеки), Libtool должен также включать в себя внутренние библиотеки, независимо от того, был ли frontend.la скомпилирован как статический или общая библиотека.

PS: Дело было бы немного в другом, если бы ваши бэкэнд-библиотеки на самом деле были модулями Libtool (a.k.a. plugins), которые были добавлены внешним интерфейсом.

...