2009-05-27 4 views
28

Скажем, у меня есть a.so и b.so. Могу ли я создать c.so как единую общую библиотеку со всеми функциями, экспортируемыми a и b, конечно же, разрешая все внутризависимости (т. Е. Все функции b.so, вызванные a.so и наоборот)?Объединить несколько общих библиотек .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

Благодарности

+0

В конце концов я прибегла использовать сценарий библиотеки с группой, которая позволяет мне показать все маленькие библиотеки как одну, но одно программное обеспечение может просто ссылаться на правую «югу» -библиотеку. – Metiu

ответ

38

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

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

gcc -shared -o c.so -Wl,--whole-archive a.a b.a -Wl,--no-whole-archive 
+0

Спасибо за полезный флаг: весь архив! –

+0

Здесь ли порядок архивов? Если у меня есть куча файлов .a, могу ли я использовать * .a? – Raj

+1

@Raj Нет, порядок не имеет значения - все они будут включены во всей их полноте. Если у вас нет переопределений символов в вашем '* .a', тогда' * .a' будет работать (TM). –

7

На практике это не представляется возможным.

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

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

+1

", если у вас есть доступ к исходным или объектным файлам для обеих библиотек, легко скомпилировать/связать объединенные SO из них." --- Как мне это сделать ? В частности, на платформе Android. –

Смежные вопросы