Преобразовать статическую библиотеку в общую библиотеку?
-
19-08-2019 - |
Вопрос
У меня есть сторонняя библиотека, которая состоит в основном из большого количества статических (.a
) библиотечные файлы.Я могу скомпилировать это в один .a
файл библиотеки, но мне действительно нужно, чтобы это был один .so
файл общей библиотеки.
Есть ли способ преобразовать статический .a
файл в общий доступ .so
файл?Или, в более общем смысле, есть ли хороший способ объединить огромное количество статических .a
файлы с несколькими .o
объектные файлы в один .so
файл?
Решение
Делает ли это (с соответствующими -L, конечно)
gcc -shared -o megalib.so foo.o bar.o -la_static_lib -lb_static_lib
Не сделать это?
Другие советы
Вы не можете сделать это, если объекты в статической библиотеке были скомпилированы без -fPIC или подобного.
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 целиком.
ar -x lib***.a
gcc -shared *.o -o lib***.so
ar -x
также может быть полезно, если вы хотите сосредоточиться на конкретных объектах вашего .a
s, и вы не хотите ничего добавлять самостоятельно.
Примеры:
ar -x lib***.a
gcc -shared *.o -o lib***.so