Смешивание статических и общих библиотек - PullRequest
6 голосов
/ 26 марта 2011

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

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

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

Спасибо!

1 Ответ

11 голосов
/ 26 марта 2011

Моя цель - связать 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.

...