Типы библиотек start

Материал из ALT Linux Wiki

Статистические и динамические библиотеки

Примечание: Обратите внимание, что это не официальная документация, а попытка начинающего разработчика объяснить материал начинающим разработчикам.

Виды

Статическая библиотека

Примечание: Статические библиотеки имеют расширение .a, где .a означает «архив».

Библиотеки, которые связываются с программой на этапе компиляции, называются статическими библиотеками. Их также называют статически связываемыми библиотеками. Они состоят из набора процедур, внешних функций и переменных. После связывания с программой на этапе компиляции, они копируются в целевое приложение с помощью компилятора, который, в свою очередь, создает объектный файл и автономный исполняемый файл.

Эти типы библиотек быстрее, чем динамические библиотеки, так как набор часто используемых объектных файлов помещается в один исполнимый библиотечный файл.

Недостаток использования статической библиотеки заключается в том, что код, который используется для её создания, становится частью финального исполнимого файла, и его нельзя изменить без повторной компиляции библиотеки.

Динамическая библиотека

Примечание: Динамические библиотеки имеют расширение .so, где .so обозначает shared object (разделяемый объект).

Библиотеки, которые существуют как отдельные файлы вне исполняемых файлов, называются динамическими библиотеками. Во время компиляции программа создает копию файла библиотеки (во время компиляции исполняемый файл получает ссылку, указывающую на библиотеку, но объектные файлы не загружаются внутрь исполняемого файла).

Код, связанный с исполняемым файлом из статической библиотеки нельзя изменить без перекомпиляции. Динамическая библиотека, напротив, может быть изменена без перекомпиляции. Статическая библиотека копируется в код каждой исполняемой программы во время компиляции. Динамическая копия создается только один раз.

Преимущество использования динамических библиотек заключается в том, что одна библиотека может быть использована несколькими приложениями, и каждое приложение не нуждается в собственной копии библиотеки, как это происходит в случае со статическими библиотеками.

Недостаток динамических библиотек в том, что вероятность их поломки значительно выше по сравнению со статическими библиотеками. Простым примером может служить ситуация, когда динамическая библиотека повреждается, и исполнимый файл больше не работает.

Вывод

Статическая библиотека дает исполняемому файлу больше автономии, потому что код находится внутри него.

Правила ALT Linux

По правилам сборки пакетов в ALT Linux статические библиотеки должны паковаться в отдельные подпакеты, что связано со спецификой их использования.

Если имя devel-подпакета заканчивается суффиксом -devel, то имя нового devel-static-подпакета будет заканчиваться суффиксом -devel-static. При разделении подпакетов следует помнить о внутрипакетных зависимостях: В списке зависимостей devel-static-подпакета должна присутствовать зависимость от -devel = %version-%release.

Определение вида библиотеки в спеке

По файлу спека

Просмотрите спек пакета на наличие файла с расширением *.a. В данном случае это строка:

%{_libdir}/libart_lgpl_2.a
%package -n %{libart}_lgpl-devel
Summary:        Library of functions for 2D graphics - development files
Group:          Development/Other
Provides:		libart_lgpl-devel = %{version}-%{release}
Requires:       libart_lgpl = %{version}-%{release}

%description -n %{libart}_lgpl-devel
A library of functions for 2D graphics supporting a superset of the
PostScript imaging model, designed to be integrated with graphics, artwork,
and illustration programs. It is written in optimized C, and is fully
compatible with C++. With a small footprint of 10,000 lines of code, it is
especially suitable for embedded applications.

%files -n %{libart}_lgpl-devel
%{_bindir}/libart2-config
%{_libdir}/libart_lgpl_2.a
%{_libdir}/libart_lgpl_2.so
%dir %{_includedir}/libart-2.0

По ошибке

Если, например, у вас при сборке пакета появляется сообщение вида:

process-lto: ERROR: ./usr/lib64/libart_lgpl_2.a: contains __gnu_lto_slim only.
061-brp-strip-lto.brp: Most likely this file contains GIMPLE bytecode that should NOT be packaged <-- Смотрим сюда
061-brp-strip-lto.brp: since its format can change between GCC versions.
061-brp-strip-lto.brp: Use -ffat-lto-objects option to package machine code in static libraries, e.g.
061-brp-strip-lto.brp: %{?optflags_lto:%global optflags_lto %optflags_lto -ffat-lto-objects}
061-brp-strip-lto.brp: Alternatively, you might want to stop packaging static libraries
061-brp-strip-lto.brp: or disable link-time optimization for this package.
error: Bad exit status from /usr/src/tmp/rpm-tmp.92248 (%install)

то тут стоит обратить внимание на строчку

 process-lto: ERROR: ./usr/lib64/libart_lgpl_2.a: contains __gnu_lto_slim only.

Она говорит о том, что в собираемом пакете используется статическая библиотека.

Что делать?

С такими пакетами можно поступить одним из двух способов:

  • перестать паковать статические библиотеки;
  • включить -ffat-lto-objects, добавив в спек-файл
%{?optflags_lto:%global optflags_lto %optflags_lto -ffat-lto-objects}

Данная строка добавляется в начало спека.

Как оформить в спеке упаковку статической библиотеки в отдельный пакет

Источники