Типы библиотек start
Статистические и динамические библиотеки
Виды
Статическая библиотека
Библиотеки, которые связываются с программой на этапе компиляции, называются статическими библиотеками. Их также называют статически связываемыми библиотеками. Они состоят из набора процедур, внешних функций и переменных. После связывания с программой на этапе компиляции, они копируются в целевое приложение с помощью компилятора, который, в свою очередь, создает объектный файл и автономный исполняемый файл.
Эти типы библиотек быстрее, чем динамические библиотеки, так как набор часто используемых объектных файлов помещается в один исполнимый библиотечный файл.
Недостаток использования статической библиотеки заключается в том, что код, который используется для её создания, становится частью финального исполнимого файла, и его нельзя изменить без повторной компиляции библиотеки.
Динамическая библиотека
Библиотеки, которые существуют как отдельные файлы вне исполняемых файлов, называются динамическими библиотеками. Во время компиляции программа создает копию файла библиотеки (во время компиляции исполняемый файл получает ссылку, указывающую на библиотеку, но объектные файлы не загружаются внутрь исполняемого файла).
Код, связанный с исполняемым файлом из статической библиотеки нельзя изменить без перекомпиляции. Динамическая библиотека, напротив, может быть изменена без перекомпиляции. Статическая библиотека копируется в код каждой исполняемой программы во время компиляции. Динамическая копия создается только один раз.
Преимущество использования динамических библиотек заключается в том, что одна библиотека может быть использована несколькими приложениями, и каждое приложение не нуждается в собственной копии библиотеки, как это происходит в случае со статическими библиотеками.
Недостаток динамических библиотек в том, что вероятность их поломки значительно выше по сравнению со статическими библиотеками. Простым примером может служить ситуация, когда динамическая библиотека повреждается, и исполнимый файл больше не работает.
Вывод
Статическая библиотека дает исполняемому файлу больше автономии, потому что код находится внутри него.
Правила 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}
Данная строка добавляется в начало спека.