Как сделать ссылку на libabc.a вместо libabc.so? - PullRequest
1 голос
/ 08 ноября 2011

В книге Autotools: Руководство по GNU Autoconf, Automake и Libtool , глава 6 (сборка библиотек с помощью libtool), приведен пример библиотеки ссылок.

В этом примере библиотека libjupiter.so связана с другой библиотекой libjupcommon.a.Первая попытка не удалась, потому что libjupiter.so требуется PIC, а libjupcommon.a - нет.Автор добавляет libjupcommon_a_CFLAGS = -fPIC, чтобы исправить это.Это становится намного лучше, но появляется предупреждение ' Связывание общей библиотеки libjupiter.la со статической библиотекой ../common/libjupcommon.a не является переносимым! '.

Поэтомуавтор снова изменяет файл Makefile.am, используя libtool для сборки libjupcommon.la.libjupiter ссылается на libjupcommon.la.Например:

noinst_LTLIBRARIES = libjupcommon.la

libjupcommon_la_SOURCES = jupcommon.h print.c

и

...

libjupiter_la_LIBADD = ../common/libjupcommon.la

На этот раз все в порядке.


Теперь моя проблема:

У меня есть библиотека, нужна другая библиотека, точно так же, как libjupiter нужна libjupcommonОтличие мое libjupcommon от другого проекта и установлено в систему.Это не noinst_LTLIBRARIES.Существуют версии .so и .a.Когда я пытаюсь связать libjupcommon.la, как показано в примере, выбирается .so, но мне не нужны динамические связи.Я хочу сделать ссылку на .a, как в примере в книге.

Явная ссылка на .a (с помощью _LIBADD = .a файла) дает полезную библиотеку, но выдает предупреждение '.... не переносится ».

Как правильно в этом случае добиться ссылки на .a?

PS: Загрузите пример с официального сайта книги autotools/book/jupiter-libtool-ch6/common измените файл Makefile.am noinst_LTLIBRARIES на lib_LTLIBRARIES, что должно быть похоже на мою проблему.

Ответы [ 2 ]

2 голосов
/ 08 ноября 2011

Есть пара вещей, которые вы можете попробовать.Вы можете попробовать запустить configure с параметром --disable-shared, чтобы отключить компиляцию общих библиотек (и снова добавить статический lib в libfoo_LIBADD).Вы можете попробовать добавить -static к libfoo_LDFLAGS, чтобы libtool построил его статически (опять же со статической библиотекой, добавленной к libfoo_LIBADD).

РЕДАКТИРОВАТЬ: Поскольку необходимы как статические, так и разделяемые библиотеки, выигранный вышене работает.

Попробуйте добавить:

AC_CHECK_LIB([abc],[some_function_in_libabc])

для configure.ac.

1 голос
/ 10 апреля 2015

Вы можете принудительно установить статическую связь с одной библиотекой (при этом оставляя все остальные ссылки общими), используя эту конструкцию:

-Wl,-Bstatic -Wl,-whole-archive -Xlinker -l$1 -Wl,-no-whole-archive -Wl,-Bdynamic

Замените $ 1 выше именем вашей библиотеки.1007 * Объяснение: Большинство из вышеперечисленных чудовищ заключается в том, чтобы обойти тот факт, что libtool перестроит аргументы командной строки, даже если это очень полезно.Использование -Xlinker заставит libtool игнорировать -l $ 1 и не переупорядочивать его.-Wl, -Bstatic указывает компоновщику связать все следующие библиотеки как статические.-Wl, -Bdynamic переключается обратно на динамическое связывание для других библиотек.

...