Строить .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
могут понадобиться для связывания или запуска программы.