Одной вещью не пропустить является экосистема. Я работал в магазине CVSNT, и я находил, что инструменты все более с открытым исходным кодом поддерживали SubVersion по умолчанию.
Предполагается, что у вас есть исходный код для всех общих объектов:
При условии отсутствия конфликтов пространств имен (которых не должно быть, если они сосуществуют как есть), он было бы не так уж сложно встроить их в один разделяемый объект.
Если разделяемые библиотеки сами зависят от кода из другой библиотеки, порядок будет иметь значение. Настоящая работа - просто определить зависимости в 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
Конечно, это немного сложнее, чем показано.
Я никогда не пробовал этого и не делаю.