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