Как пользователь autotools может указать комбинацию статической и динамической привязки?

Я создаю программу с autoconf, automake и libtool. Моя работа требует, чтобы я статически связывал (большинство) библиотеки. Это не было проблема в прошлом, потому что я мог статически связывать все с -all-static. Теперь это проблема, потому что я должен использовать библиотеку, которая только динамический; это было дано нам третьей стороной, и у нас нет источника.

Конечно, -all-static теперь приводит к сбою сборки. Это возможно сообщить libtool статически связать все, кроме этой библиотеки? Можно ли использовать libtool любую комбинацию статических и динамическое соединение, или все это или ничего?

До сих пор я пытался создать удобную библиотеку с LDFLAGS = -static, которая зависит от библиотек, которые я хочу статически связывать. Но libtool не объединяет статические библиотеки, как я бы надеялся. Программа в зависимости от библиотеки удобства все еще динамически связывает все.

Я также пробовал --disable-shared, но это не повлияло на сборку.


Эти вопросы похожи, но на самом деле не отвечают на мой вопрос:

Привязать статическую библиотеку к общей с Libtool

Возможно ли связать некоторые - но не все - библиотеки статически с libtool?

(Я не хочу удалять разделяемые библиотеки из своей системы, а полный путь для всего - это не лучше, чем связывание вручную, но, возможно, это единственный способ.)

Ответ 1

Вы не указали операционную систему, но допустим, что это относительно новая версия Unix/Linux/OSX. Если это не так, игнорируйте следующее предупреждение.

Прежде чем я отвечу, вы должны знать, что смешивать статический и общий код в большинстве систем на базе ELF (Unix/Linux) проблематично. Одна из причин заключается в том, что это может привести к потере синхронизации в коде, если вы забудете связать обновленную зависимость. Другая причина связана с природой статического кода и PIC. Вот почему libtool пытается отговорить его.

Тем не менее, в Makefile.am (при условии, что ваша последняя программа - foo, а разделяемая библиотека -):

    .
    .
    .
    foo_SOURCES = foo.c abc.c def.c hij.c
    foo_LDFLAGS = -all-static -Wl,-Bdynamic,-L/path/to,-lshared,-Bstatic
    foo_LDADD = -L../path/to -lbar -lbaz

Здесь важно то, что libtool позволяет вам закорачивать проверки и флаг GNU gcc -static (который используется libtool) путем передачи аргументов -Wl, непосредственно компоновщику (GNU ld). Для ввода пробелов между аргументами используется разделитель запятой ,.

Оба -Bstatic и -Bdynamic описаны в GNU ld информационных страницах, а также на экране справки. Опять же, поскольку вы не упомянули используемый пакет os или компилятор, я предполагаю, что GNU gcc и GNU ld в Linux. Вы можете проверить это, используя ld --help, чтобы убедиться в этом. Если по какой-то причине это не GNU ld, вам нужно будет найти эквивалентные флаги для -Bstatic и -Bdynamic, подставив их в случае необходимости.