При компиляции нашего проекта мы создаем несколько архивов (статических библиотек), скажем, 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
Я предполагаю, что объектные файлы, содержащиеся в архивах, не связаны в общей библиотеке, потому что они не используются в ней. Как заставить включение?
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
Есть идеи, откуда это взялось?