Ада-95. Компилятор GNAT

       

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


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

Файлы с исходными текстами.

  • Скомпилированный код и ALI-файлы (Ada Library Information files)

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

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

    Кроме того, должны быть доступны исходные тексты тел всех видимых настраиваемых модулей.

    Хотя это не является строго необходимым требованием, рекомендуется, чтобы пользователю были доступны все исходные тексты, которые необходимы для перекомпиляции библиотеки.

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

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

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

    Самый простой способ предусматривает непосредственное множество объектных файлов сгенерированных в процессе компиляции библиотеки.

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

    И, наконец, возможно создание динамически загружаемой библиотеки (см. использование опции -shared в справочном руководстве по GCC).

    Существует множество способов компиляции модулей, совокупность которых формирует библиотеку.

    Например, это можно выполнить с помощью написания файла управления сборкой проекта Makefile



    a
    и последующего использования утилиты 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");


    Содержание раздела