Как включить все объекты архива в общий объект?

При компиляции нашего проекта мы создаем несколько архивов (статических библиотек), скажемliby.a а такжеlibz.a каждый из которых содержит объектный файл, определяющий функциюy_function() а такжеz_function(), Затем эти архивы объединяются в общий объект, скажем,libyz.soэто одна из наших главных распространяемых целей.

g++  -fPIC  -c -o y.o y.cpp
ar cr liby.a y.o
g++  -fPIC  -c -o z.o z.cpp
ar cr libz.a z.o
g++ -shared -L. -ly -lz -o libyz.so

При использовании этого общего объекта в примере программы, скажем,x.c, ссылка не работает из-за неопределенных ссылок на функцииy_function() а такжеz_function().

g++ x.o -L. -lyz -o xyz

Это работает, однако, когда я связываю конечный исполняемый файл напрямую с архивами (статическими библиотеками).

g++ x.o -L. -ly -lz -o xyz

Я предполагаю, что объектные файлы, содержащиеся в архивах, не являютсясвязанный в общую библиотеку, потому что они не используются в ней. Как заставить включение?

Редактировать:

Включение можно принудительно использовать --whole-archiveld вариант. Но если это приводит к ошибкам компиляции:

g++ -shared '-Wl,--whole-archive' -L. -ly -lz -o libyz.so
/usr/lib/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
(.text+0x1d): undefined reference to `__init_array_end'
/usr/bin/ld: /usr/lib/libc_nonshared.a(elf-init.oS): relocation R_X86_64_PC32 against undefined hidden symbol `__init_array_end' can not be used when making a shared object
/usr/bin/ld: final link failed: Bad value

Есть идеи, откуда это?

Ответы на вопрос(1)

Ваш ответ на вопрос