Подтвердить что ты не робот

Связать статическую библиотеку с общей в процессе сборки?

У меня проблема с созданием общей библиотеки с GCC/Linux. В настоящее время эта разделяемая библиотека создается с помощью опции GCC/libtool "-shared" и все в порядке.

Теперь есть две дополнительные, статические библиотеки (.a файлы), которые должны быть добавлены к этой общей, поскольку они предоставляют некоторые функции, которые требуются для общего. Добавление этих статических библиотек с опцией "-l" не помогает, впоследствии они не являются частью файла .so.

Итак, как я могу заставить GCC/libtool действительно добавить код этих статических библиотек в общую библиотеку?

Спасибо!

4b9b3361

Ответ 1

В этом случае вам нужна опция --whole-archive linker, чтобы связать компоновщик с целым содержимым статических libs в общую библиотеку.

g++ -shared sample.o -o libSample.so -Wl,-whole-archive -lmylib1.a -lmylib2.a -Wl,-no-whole-archive

От man ld:

Для каждого архива, указанного в командной строке после параметра - весь-архивный, включите каждый объектный файл в архив по ссылке, а не поиск в архиве необходимых файлов объектов. Обычно это используется для превращения архивного файла в общую библиотеку, заставляя каждый объект быть включенным в итоговую общую библиотеку. Эта опция может использоваться несколько раз.

Две заметки при использовании этой опции из gcc: во-первых, gcc не знает об этой опции, поэтому вам нужно использовать -Wl, -all-archive. Во-вторых, не забудьте использовать -Wl, -no-whole-archive после списка архивов, потому что gcc добавит свой собственный список архивов к вашей ссылке, и вы можете не захотеть, чтобы этот флаг также влияют на них.

Ответ 2

Вам нужен только параметр - весь-архивный, чтобы заставить компоновщик включать библиотеку, но он должен иметь возможность вывести свои собственные потребности из непревзойденных символов.

Убедитесь, что любые статические библиотеки в командной строке появляются после их зависимых объектных файлов, например:

g++ -Wl,-E -g -pipe -O2 -pipe -fPIC  myobjectfile.o mystaticlibrary.a -shared -o mylib.so