Объединение нескольких общих библиотек .so - PullRequest
35 голосов
/ 27 мая 2009

Скажите, у меня есть a.so и b.so. Могу ли я создать c.so как единую общую библиотеку со всеми функциями, экспортируемыми a и b, конечно, разрешая все внутренние зависимости (то есть все функции b.so, вызываемые a.so и наоборот)? *

Я пытался

gcc -shared -Wl,soname,c.so -o c.so a.so b.so

но это не работает.

То же самое происходит, если я заархивирую a.o и b.o в a.a и b.a (которые не должны изменять a.o и b.o) и выполните

gcc -shared -Wl,soname,c.so -o c.so a.a b.a

Спасибо

Ответы [ 2 ]

40 голосов
/ 29 мая 2009

Объединение нескольких общих библиотек в одну действительно практически невозможно на всех UNIXen, кроме AIX: компоновщик считает .so «конечным» продуктом.

Но объединение архивов в .so не должно быть проблемой:

gcc -shared -o c.so -Wl,--whole-archive a.a b.a -Wl,--no-whole-archive
7 голосов
/ 27 мая 2009

На практике это невозможно.

С точки зрения компоновщика, библиотека SO является конечным продуктом, который не содержит информации о перемещении, необходимой для компоновки.

Если у вас есть доступ к исходным или объектным файлам для обеих библиотек, легко скомпилировать / связать объединенный SO из них.

...