При компиляции нашего проекта мы создаем несколько архивов (статические библиотеки), скажем 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
, ссылка не работает из-за ссылки undefined на функции y_function()
и z_function()
.
g++ x.o -L. -lyz -o xyz
Он работает, однако, когда я связываю финальный исполняемый файл напрямую с архивами (статические библиотеки).
g++ x.o -L. -ly -lz -o xyz
Я предполагаю, что объектные файлы, содержащиеся в архивах, не связаны в разделяемой библиотеке, потому что они не используются в ней. Как принудительно включить?
Edit:
Включение может быть принудительно использовано с помощью опции -whole-archive ld
. Но если результаты в ошибках компиляции:
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
Любая идея, откуда это происходит?