Преобразовать статическую библиотеку в общую библиотеку? - PullRequest
48 голосов
/ 17 марта 2009

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

Есть ли способ преобразовать статический файл .a в общий файл .so? Или, в более общем смысле, есть ли хороший способ объединить огромное количество статических .a файлов с несколькими .o объектными файлами в один .so файл?

Ответы [ 5 ]

40 голосов
/ 17 марта 2009

Делает это (с соответствующими -L, конечно)

gcc -shared -o megalib.so foo.o bar.o -la_static_lib -lb_static_lib

Не сделать это?

23 голосов
/ 18 марта 2009

Вы не можете сделать это, если объекты в статической библиотеке были скомпилированы без -fPIC или подобного.

15 голосов
/ 08 сентября 2010
g++ -shared -o megalib.so foo.o bar.o -Wl,--whole-archive -la_static_lib -lb_static_lib -Wl,--no-whole-archive -lc_static_lib -lother_shared_object

Я не уверен насчет gcc, но для g ++ мне пришлось добавить параметр компоновщика --whole-archive, чтобы включить объекты из статических библиотек в общий объект. Опция --no-whole-archive необходима, если вы хотите создать ссылку на libc_static_lib.a и libother_shared_object.so, но не включать их в megalib.so.

9 голосов
/ 04 мая 2017
ar -x lib***.a
gcc -shared *.o -o lib***.so
2 голосов
/ 14 января 2016

ar -x также может быть полезным, если вы хотите сфокусироваться на конкретных объектах из ваших .a s и не хотите добавлять что-либо самостоятельно.

Примеры:

ar -x lib***.a
gcc -shared *.o -o lib***.so
...