Libtool: статически связать одну из созданных в проекте библиотек

#makefile #build #static-linking #autotools #libtool

#makefile #сборка #статическое связывание #автоинструменты #libtool

Вопрос:

У меня есть проект, который строится с

 autoreconf --install
./configure
make
 

и содержит configure.ac и Makefile.am
Проект создает 2 библиотеки и один исполняемый файл, который динамически связывает их. Одна библиотека — cpp, другая и исполняемый файл — чистый C. Я хочу статически связать одну из библиотек (cpp one) и сохранить библиотеку c для динамической связи. Мой упрощенный Makefile.am

 ACLOCAL_AMFLAGS = -I m4

SUBDIRS = include doc po

AM_CPPFLAGS = -Iinclude
AM_CPPFLAGS  = -D__STRICT_ANSI__
AM_CPPFLAGS  = -DNDEBUG

WARNFLAGS = -Wall

AM_CFLAGS = $(WARNFLAGS) $(OPENMP_CXXFLAGS) -std=c11
AM_CXXFLAGS = $(WARNFLAGS) -std=c  11

localedir = $(datadir)/locale
DEFS = -DLOCALEDIR="$(localedir)" @DEFS@

lib_LTLIBRARIES = libmy.la libmy-settings.la

libmy_la_SOURCES = src/sharedlib.c src/sharedlib.h

libmy_settings_la_SOURCES = src/staticlib.cpp src/staticlib.h

bin_PROGRAMS = myapp

myapp_SOURCES = myapp.c

myapp_LDADD = libmy.la libmy-settings.la

 

Libtool генерирует оба .a и .so файлы, ./.libs/ но предпочитает Libtool .so . В последней make команде я вижу gcc -Wall -std=c11 -g -O2 -o .libs/myapp myapp.o ./.libs/libmy.so ./.libs/libmy-settings.so . Если я заменю ее на gcc -Wall -std=c11 -g -O2 -o .libs/myapp myapp.o ./.libs/libmy.so ./.libs/libmy-settings.a — она работает и дает мне то, чего я пытаюсь достичь. Вопрос в том, как добиться этого автоматически с помощью Makefile.am ?

Насколько я понимаю, я не могу просто добавить myapp_LDFLAGS=-lmy-settings.a bcs, это не заменит аргумент общей ссылки, а добавит новый. И я не могу удалить libmy-settings.la from lib_LTLIBRARIES или myapp_LDADD bcs, он не будет генерировать libmy-настройки.a или libmysettings.so в ./.libs/ вообще. Какие-нибудь подсказки?

Комментарии:

1. Вам вообще нужно иметь libmy-settings отдельно устанавливаемую библиотеку? То есть вы пытаетесь обеспечить, чтобы другие программы тоже могли ее связать?

2. Это libmy.so отдельно устанавливаемая библиотека. Это libmy-settings код, который я вношу в проект, и я хотел бы сделать его статически связанной библиотекой, а не устанавливаемой.

Ответ №1:

Поскольку libmy-settings не обязательно должна быть отдельно устанавливаемой библиотекой, у вас есть две довольно простые альтернативы:

  1. Добавьте ее исходники в myapp_SOURCES , и libmy-settings.la полностью исключите из картины. То, что дополнительные источники расположены в другом каталоге и написаны на другом (поддерживаемом autotools) языке, не должно быть проблемой. Этот подход может быть вам полезен с точки зрения выбора Autotools правильного драйвера компоновщика и параметров без вашего вмешательства.
  2. Создайте libmy-settings.la как служебную библиотеку вместо устанавливаемой. Это достигается путем ее маркировки noinst :
     lib_LTLIBRARIES = libmy.la
    noinst_LTLIBRARIES = libmy-settings.la