Строить .so модуль с autotools/libtool без установленных .la и .a вариантов

Как создать и установить модуль .so с autotools/libtool без библиотек .la и .a также устанавливается в путь -prefix?

В настоящее время я использую следующий Makefile.am:

lib_LTLIBRARIES = libCurlDownloader.la
libCurlDownloader_la_SOURCES = Curl.cpp
libCurlDownloader_la_LDFLAGS = -module -avoid-version

Он работает, но в дополнение к libCurlDownloader.so он также устанавливает libCurlDownloader.la и libCurlDownloader.a, что нежелательно.

Обновление # 1

Можно сделать .a не сгенерировать, используя либо

./configure --disable-static

или

AC_ENABLE_SHARED(yes)
AC_ENABLE_STATIC(no)

в файле configure.ac

Но по-прежнему возникает вопрос, как сделать .la не устанавливаться в установку --prefix при установке .so.

Обновление # 2

Можно удалить файлы .la из установки --prefix с помощью

install-exec-hook: find $(DESTDIR)$(libdir) -type f -name \*.la -delete

Ответы

Ответ 1

Я наткнулся на этот вопрос, потому что он использовал термин "модуль", который в automake/libtool говорит - это термин для плагина. У меня есть плагиновая система в Finit, поэтому я создаю свои плагины с помощью '-module', чтобы не создавать файлы .a. Но я все еще получаю файлы .la, которые действительно даже не применимы в случае "-модуля".

Мне еще не удалось найти документальный способ пропустить файлы .la для плагинов, но вот как я это делаю:

AM_LDFLAGS = -module -avoid-version -shared
pkglib_LTLIBRARIES = alsa-utils.la bootmisc.la

install-exec-hook:
        @(cd $(DESTDIR)$(pkglibdir) && $(RM) $(pkglib_LTLIBRARIES))

Чтобы быть ясным, в моем случае использования никто не собирается "ссылаться" на мой плагин .so, поэтому файлы .la действительно бесполезны.

Ответ 2

Не обязательно удалять файлы .la. Файлы .la содержат информацию, которая используется в двух ситуациях:

  • Статическая привязка к встроенной библиотеке. При статической привязке (т.е. .a с -static) нет информации о зависимостях связанной библиотеки, поэтому libtool может использовать информацию в файле .la для создания соответствующей команды ld, ссылающейся на все необходимые зависимости. Это часто более важно в среде, такой как MinGW, где компоновщик требует, чтобы одна и та же библиотека указывала кратные в определенном порядке для решения рекурсивных зависимостей. Это всего лишь проблема, если вы собираетесь создать статический двоичный файл.

  • Динамическая загрузка библиотеки сборки на некоторых платформах (т.е. lt_dlopen при использовании libltdl). Аналогично, на некоторых платформах зависимости модуля компиляции не закодированы в двоичном формате, поэтому файл .la необходим, чтобы lt_dlopen находил и загружал правильные зависимости. На платформах ELF (включая Linux) и PE-платформах (например, Windows) зависимости хранятся в библиотеке, поэтому lt_dlopen будет работать без файлов .la. Формат MachO на MacOS может потребовать файлы .la при создании пакетов.

Пакеты Debian/Ubuntu решили исключить файлы .la из своих пакетов, потому что вторая причина не подходит для Linux, и они предпочли бы, чтобы вы не создавали статические двоичные файлы в первую очередь. На других платформах, для которых libtool предназначен для поддержки, файлы .la могут понадобиться для связывания или запуска программы.