Ответ 1
Это (с соответствующим -L, конечно)
gcc -shared -o megalib.so foo.o bar.o -la_static_lib -lb_static_lib
Не так ли?
У меня есть сторонняя библиотека, которая состоит в основном из большого количества статических файлов (.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 linker для включения объектов из статических библиотек в общий объект. Опция -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
, и вы не хотите ничего добавлять.