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

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

При компиляции нашего проекта мы создаем несколько архивов (статические библиотеки), скажем 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

Любая идея, откуда это происходит?

4b9b3361

Ответ 1

Вы можете попробовать (ld (2)):

   --whole-archive
       For each archive mentioned on the command line after the --whole-archive option, include every object file in the
       archive in the link, rather than searching the archive for the required object files.  This is normally used to turn
       an archive file into a shared library, forcing every object to be included in the resulting shared library.  This
       option may be used more than once.

(gcc -Wl, - весь архив)

Кроме того, вы должны положить -Wl,--no-whole-archive в конец списка библиотек. (как сказал Дмитрий Юдаков в комментарии ниже)