Включить статическую библиотеку в общий объект?

Я хотел бы скомпилировать кучу статических библиотек в общий объект. До сих пор у меня есть

g++ -Wl -shared -fPIC -o myshared.so objs/*.o

Где objs/*.o выше содержит все объектные файлы, извлеченные из различных статических библиотек с использованием ar.

ОБНОВЛЕНИЕ: в принципе, мне интересно, смогу ли я использовать файлы .a непосредственно в командной строке без необходимости их извлечения.


person chriskirk    schedule 16.03.2012    source источник
comment
Я бы действительно избегал смешивания кода, отличного от PIC (который является обычным вариантом внутри статических библиотек), с кодом PIC (PIC = позиционно-независимый код). Вы получите много неприятностей.   -  person Basile Starynkevitch    schedule 16.03.2012


Ответы (2)


Это действительно двухэтапный процесс:

ar -x mylib.a
gcc -shared *.o -o mylib.so
person karlphillip    schedule 16.03.2012
comment
Хорошо, я надеялся, что g++ может сделать все это сразу. - person chriskirk; 16.03.2012
comment
На самом деле вы можете: -Wl,--whole-archive,foo.a,--no-whole-archive (не уверен, что правильно понял название опции). Я согласен с тем, что @Basil сказал о коде NON-PIC. - person ams; 18.03.2012

Причина, по которой вы не можете использовать gcc -shared -o foo.so foo.a, заключается в том, что архивы обрабатываются по-разному: объектные файлы из архива используются только для разрешения неопределенных символов, которых нет, поскольку вы не указали предыдущие файлы .o.

person jørgensen    schedule 16.03.2012