Включить статическую библиотеку в динамическую библиотеку - PullRequest
3 голосов
/ 20 сентября 2010

У меня следующая проблема:

  • несколько объектных файлов a1.o, a2.o, a3.o, ...
  • архива libxxxx.a.Архив libxxxx.a содержит только объектные файлы: b1.o, b2.o и т. Д. *

Я хотел бы создать общую библиотеку (.so) из всех объектных файлов.

Проблема: Если я использую:

g++ -shared libxxxx.a a1.o a2.o ... -o libnew.so

g ++ понимает, что я хочу связать со статической библиотекой libxxxx.a и не включает все символы архива.

Простой обходной путь - сначала развернуть архив с помощью ar -x, а затем создать библиотеку, но это не очень «элегантно».

Должна быть простая команда, чтобы заставить g ++ включить весь архив в.но я не могу его найти.

Спасибо за вашу помощь.

1 Ответ

6 голосов
/ 24 сентября 2010

С man ld:

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

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

Пример:

g++ -shared -o yourlib a.o. b.o. c.o -Wl,-whole-archive libstatic.a -Wl,-no-whole-archive

Обратите внимание, что в вашем примере вы сначала помещаете статическую библиотеку, а затем объектные файлы - в этом случае символы, используемые в объектных файлах и определенные в статической библиотеке, не будут найдены, если вы не используете опцию компоновщика --whole-archive. Если вы хотите включить только необходимые символы из статической библиотеки, вам нужно поместить в нее after объектные файлы.

g++ -o your_app a.o b.o c.o -lyour_static_lib
...