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