Как объединить общие библиотеки?

Одной вещью не пропустить является экосистема. Я работал в магазине CVSNT, и я находил, что инструменты все более с открытым исходным кодом поддерживали SubVersion по умолчанию.

8
задан Georg Schölly 19 November 2009 в 11:03
поделиться

1 ответ

Предполагается, что у вас есть исходный код для всех общих объектов:

При условии отсутствия конфликтов пространств имен (которых не должно быть, если они сосуществуют как есть), он было бы не так уж сложно встроить их в один разделяемый объект.

Если разделяемые библиотеки сами зависят от кода из другой библиотеки, порядок будет иметь значение. Настоящая работа - просто определить зависимости в make-файле. Я никогда не видел циклических зависимостей в успешной ссылке SO, поэтому я сомневаюсь, что они у вас есть для начала. Т.е. foo () зависит от bar (), который зависит от foo ().

Я делал это несколько раз, хотя сами библиотеки были тривиальными. Я взял части из ustr (обработчика строк), обработчика файла конфигурации, некоторых других настраиваемых парсеров и других служебных функций и создал настраиваемый мэш-ап.

Настоящая проблема заключается в том, чтобы внести улучшения в каждую из них после их объединения, однако я не уверен, что это проблема для вас.

Итак, если у вас есть:

libfoo.so: $(LIB_FOO_OBJECTS) $(LIB_BAR_OBJECTS) $(LIBFOOBAR_OBJECTS)

Где:

LIB_FOO_OBJECTS = \
     $(libfoo)/foo.o \
     $(libfoo)/strings.o

LIB_BAR_OBJECTS = \
     $(libbar)/bar.o
 ....

.. .и порядок правильный .. остальное довольно просто. Обратите внимание, что я не показывал значения заголовков, все делают это немного по-своему. Однако они важны при создании мэшапов, так как вы, вероятно, захотите избежать перекомпиляции всей библиотеки каждый раз, когда изменяется один заголовок.

NB: Если все три проекта используют автоинструменты ... ваша задача только что стала экспоненциально проще (или сложнее) в зависимости.

Если у вас НЕТ исходного кода

Если есть статическая версия каждой библиотеки, вы можете извлечь объекты и использовать их. То есть:

$ cp /usr/lib/foo.a ./foo.a
$ ar x foo.a
$ gcc -fPIC -shared *.o -o foo.so

Конечно, это немного сложнее, чем показано.

Я никогда не пробовал этого и не делаю.

8
ответ дан 5 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: