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 из lib_LTLIBRARIES или myapp_LDADD bcs, он вообще не сгенерирует libmy-settings.a или libmysettings.so в ./.libs/. Любые подсказки?

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

John Bollinger 13.12.2020 21:48

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

truf 13.12.2020 22:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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
    

Другие вопросы по теме