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

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

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

Править:

Включение может быть вызвано с помощью - целый архив 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

Какая-либо идея, куда это прибывает из?

15
задан Didier Trosset 4 May 2010 в 09:16
поделиться

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, - без всего архива в конце списка библиотек. (как сказал Дмитрий Юдаков в комментарии ниже)

21
ответ дан 1 December 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: