Как сделать ссылку на libabc.a вместо libabc.so?

В книге 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 измените noinst_LTLIBRARIES файла Makefile.am на lib_LTLIBRARIES, это должно быть близко к моей проблеме.


person Cha Cha    schedule 08.11.2011    source источник
comment
Какую библиотеку вы хотите построить? Общая библиотека или статическая библиотека? Нет смысла связываться с установленной .a библиотекой, если вы создаете разделяемую библиотеку, отсюда и предупреждение libtool. Если вы создаете статическую библиотеку, вы должны явно указать это (см. ответ ldav1s).   -  person adl    schedule 08.11.2011
comment
Я хочу создать общую библиотеку. Нет смысла даже если установленный .a это PIC? Почему это так?   -  person Cha Cha    schedule 08.11.2011
comment
Но в этом случае .a не был сгенерирован Libtool. Насколько я знаю, файлы .a, установленные Libtool, не являются PIC.   -  person adl    schedule 09.11.2011


Ответы (2)


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

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

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

AC_CHECK_LIB([abc],[some_function_in_libabc])

настроить .ac.

person ldav1s    schedule 08.11.2011
comment
Вы имеете в виду скомпилировать только статический? Я думаю, это сработает. Но мне нужны как статические, так и динамические libjupcommon; и сделать libjupiter.so ссылки статическими. - person Cha Cha; 08.11.2011
comment
noinst_LTLIBRARIES — это удобные библиотеки, предназначенные для перелинковки с каким-либо исполняемым файлом или другой библиотекой во время сборки. - person ldav1s; 09.11.2011
comment
Прочитав код libtool, я убедился, что мне следует сделать только статическую библиотеку. Подобно libfoo.so, libfoo.a libfoo_static.a. Спасибо ldav1s. - person Cha Cha; 01.03.2012

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

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

Замените $1 выше именем вашей библиотеки.

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

person user2679859    schedule 10.04.2015