В книге 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
, это должно быть близко к моей проблеме.
.a
библиотекой, если вы создаете разделяемую библиотеку, отсюда и предупреждение libtool. Если вы создаете статическую библиотеку, вы должны явно указать это (см. ответ ldav1s). - person adl   schedule 08.11.2011.a
это PIC? Почему это так? - person Cha Cha   schedule 08.11.2011.a
не был сгенерирован Libtool. Насколько я знаю, файлы.a
, установленные Libtool, не являются PIC. - person adl   schedule 09.11.2011