Copyright (C) А.Гавва V-0.4w май 2004

6. GNAT и библиотеки

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

6.1 Создание Ада-библиотеки

В среде системы компилятора GNAT любая библиотека состоиз из двух компонентов:

Согласно требований системы компилятора GNAT, при использовании других пакетов необходимо, чтобы некоторые исходные тексты были доступны компилятору. Таким образом, минимально необходимым множеством файлов с исходными текстами являются файлы с исходными текстами спецификаций всех пакетов, которые формируют видимую часть библиотеки, а также файлы с исходными текстами от которых зависят файлы спецификаций пакетов библиотеки. Кроме того, должны быть доступны исходные тексты тел всех видимых настраиваемых модулей. Хотя это не является строго необходимым требованием, рекомендуется, чтобы пользователю были доступны все исходные тексты, которые необходимы для перекомпиляции библиотеки. В результате этого пользователю предоставляются исчерпывающие возможности в использовании межмодульных встроенных вставок (inline) и в осуществлении полноценной отладки на уровне исходных текстов. Это также может облегчить ситуацию для тех пользователей, которые нуждаются в обновлении инструментальных средств при котором может возникнуть необходимость перекомпиляции библиотек из исходных текстов.

Обеспечение скомпилированного кода библиотеки может предусматриваться различными способами. Самый простой способ предусматривает непосредственное множество объектных файлов сгенерированных в процессе компиляции библиотеки. Кроме того, возможно объединение всех объектных файлов в едином библиотечном архиве с помощью какой-либо команды, которая предусматривается в используемой операционной системе. И, наконец, возможно создание динамически загружаемой библиотеки (см. использование опции -shared в справочном руководстве по GCC).

Существует множество способов компиляции модулей, совокупность которых формирует библиотеку. Например, это можно выполнить с помощью написания файла управления сборкой проекта Makefile и последующего использования утилиты GNU make, или путем создания скрипта для командного интерпретатора. В случае построения простой библиотеки, можно создать фиктивную головную программу, которая зависит от всех интерфейсных пакетов библиотеки. В последствии, такая фиктивная головная программа может быть представлена утилите gnatmake, в результате чего gnatmake выполнит построение всех объектных файлов библиотеки. Ниже показан пример подобной фиктивной головной программы и общий вид команд, которые могут быть использованы для построения единого библиотечного архива объектных файлов или динамически загружаемой библиотеки.


with My_Lib.Service1;
with My_Lib.Service2;
with My_Lib.Service3;
procedure My_Lib_Dummy is
begin
    null;
end;



# компиляция библиотеки
$ gnatmake -c my_lib_dummy.adb

# нам не нужен объектный код фиктивной головной программы
$ rm my_lib_dummy.o my_lib_dummy.ali

# создание единого библиотечного архива
$ ar rc libmy_lib.a *.o
# some systems may require "ranlib" to be run as well

# или создание динамически загружаемой библиотеки
$ gnatgcc -shared -o libmy_lib.so *.o
# некоторые системы могут требовать, чтобы компиляция выполнялась с опцией -fPIC

При группировке объектных файлов библиотеки в единый библиотечный архив или динамически загружаемую библиотеку пользователь должен указывать требуемую библиотеку на этапе компоновки проекта или использовать директиву компилятора pragma Linker_Options в одном из файлов с исходными текстами:


pragma Linker_Options ("-lmy_lib");

6.2 Установка Ада-библиотеки

Установка какой-либо библиотеки в системе компилятора GNAT осуществляется копированием файлов, которые составляют библиотеку, в какое-либо определенное место на диске. Существует возможность установки файлов с исходными текстами библиотеки в самостоятельный каталог, отдельно от остальных файлов библиотеки (ALI, объектных файлов, библиотечных архивов). Это возможно благодаря тому, что пути поиска для файлов с исходными текстами и для объектных файлов определяются отдельно.

Системный администратор может установить библиотеки общего назначения в место, которое будет указано для компилятора в пути поиска по умолчанию. Для осуществления этого он должен указать расположение таких библиотек в файлах конфигурации "ada_source_path" и "ada_object_path", которые должны располагаться там же где и файл specs, который определяет конфигурацию gcc, в дереве установки системы компилятора GNAT. Расположение файла specs, определяющего конфигурацию gcc, можно узнать следующим образом:


$ gnatgcc -v

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

Файлы "ada_source_path" и "ada_object_path" могут отсутствовать после установки системы компилятора GNAT. В этом случае GNAT будет осуществлять поиск своей библиотеки времени выполнения в каталогах: "adainclude" - файлы с исходными текстами, и "adalib" - объектные и ALI файлы. При наличии файлов "ada_source_path" и "ada_object_path" компилятор не осуществляет поиска в каталогах "adainclude" и "adalib". Таким образом, файл "ada_source_path" должен указывать расположение файлов с исходными текстами библиотеки времени выполнения GNAT (которые могут быть расположены в "adainclude"). Подобным образом, файл "ada_object_path" должен указывать расположение объектных файлов библиотеки времени выполнения GNAT (которые могут быть расположены в "adalib").

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

6.3 Использование Ада-библиотеки

При использовании Ада-библиотеки необходимо указывать ее как в пути поиска файлов с исходными текстами, так и в пути поиска объектных файлов. Например, вы можете использовать библиотеку "mylib", которая установлена в каталогах "/dir/my_lib_src" и "/dir/my_lib_obj" следующим образом:


$ gnatmake -aI/dir/my_lib_src -aO/dir/my_lib_obj my_appl \
  -largs -lmy_lib

Такая команда может быть упрощена до команды вида:


$ gnatmake my_appl

когда соблюдаются следующие условия:

6.4 Перекомпиляция библиотеки времени выполнения GNAT

Бывают случаи когда возникает необходимость в самостоятельной перекомпиляции библиотеки времени выполнения GNAT. Для таких случаев предусматривается специальный файл Makefile.adalib для управления сборкой проекта с помощью утилиты GNU make. Этот файл находится в каталоге, который содержит библиотеку времени выполнения GNAT. Расположение этого каталога в системе зависит от способа установки окружения ссистемы компилятора GNAT, что можно узнать с помощью команды:


$ gnatls -v

Последняя строка, которая показывает путь поиска объектных файлов (Object Search Path), как правило, содержит путь к библиотеке времени выполнения GNAT. Файл Makefile.adalib содержит в себе документацию с инструкциями, которые необходимы для самостоятельной сборки и использования новой библиотеки.


Copyright (C) А.Гавва V-0.4w май 2004