У меня есть проект, который строится с
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
из lib_LTLIBRARIES
или myapp_LDADD
bcs, он вообще не сгенерирует libmy-settings.a или libmysettings.so в ./.libs/. Любые подсказки?
libmy.so
— это отдельно устанавливаемая библиотека. libmy-settings
— это код, который я вношу в проект, и я хотел бы сделать его статически связанной библиотекой, а не устанавливаемой.
Поскольку libmy-settings
не обязательно должна быть отдельно устанавливаемой библиотекой, у вас есть две довольно простые альтернативы:
Добавьте его источники в myapp_SOURCES
и оставьте libmy-settings.la
полностью вне поля зрения. То, что дополнительные исходники расположены в другом каталоге и написаны на другом (поддерживаемом autotools) языке, не должно быть проблемой. Такой подход может быть вам полезен с точки зрения того, что Autotools выбирает правильный драйвер компоновщика и параметры без вашего вмешательства.
Соберите libmy-settings.la
как служебную библиотеку, а не устанавливаемую. Это достигается пометкой noinst
:
lib_LTLIBRARIES = libmy.la
noinst_LTLIBRARIES = libmy-settings.la
Вам вообще нужна
libmy-settings
как отдельно устанавливаемая библиотека? То есть вы пытаетесь предусмотреть, чтобы другие программы тоже могли его слинковать?