Смешивание статических и общих библиотек

У меня есть проект, где у меня есть одна статическая библиотека libhelper.a и другой с моей фактической общей библиотекой объектов, libtestlib.so, Моя цель - связать libhelper.a в libtestlib.so, Это возможно в Linux/BSD? Когда я попробовал и создал тестовую программу, я получил следующие ошибки:

./prog1:/usr/local/lib/libtestlib.so.1.0: неопределенный символ ''

Я предполагаю, что это происходит потому, что libhelper.a не был скомпилирован с -fPIC в то время как libtestlib.so было. Как правильно создавать программы, использующие разделяемые библиотеки, которые также зависят от статических библиотек?

Спасибо!

1 ответ

Решение

Моя цель - связать libhelper.a с libtestlib.so. Это возможно в Linux?

Конечно. Это должно сделать:

gcc -shared -fPIC -o libtestlib.so $(OBJS) \
  -Wl,--whole-archive -lhelper -Wl,--no-whole-archive

libhelper.a не был скомпилирован с -fPIC

Лучше пересобрать libhelper.a с -fPIC, Если это невозможно, приведенная выше команда все равно будет работать на Linux/ix86но не на например Linux/x86_64,

Как правильно создавать программы, использующие разделяемые библиотеки, которые также зависят от статических библиотек?

Если вы включите libhelper.a в libtestlib.so как указано выше, то просто:

gcc main.c -ltestlib

это все, что тебе нужно. Если вы настаиваете на связи с libhelper.a, то вы должны сообщить конечному пользователю, что он должен связать, например, с

gcc main.c -ltestlib -lhelper

Нет способа указать, что libtestlib.so зависит от libhelper.a,

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