С GNAT, есть две работы, которые выполняет связыватель: во-первых, проверка того, что все необходимые компиляции были выполнены, так что закрытие программы является последовательным, и во-вторых, организация для развития (эти работы необходимы для любого Адасборка системы, но они могут быть реализованы по-разному).
При использовании gnatmake
первое из этих заданий обычно излишне, поскольку gnatmake
уже организовал все необходимые компиляции.Возможно ошибиться (например, переместив модуль в другую библиотеку и не удаляя его продукты компиляции из исходного места), но довольно сложно!
Разработка - это особенность Ada, которая не 'присутствует на многих других языках.Есть объяснение в gcc.gnu.org и других местах, но для простого примера,
with Foo;
package Bar is
Int : Integer := Foo.Value;
[...]
end Bar;
package Foo is
function Value return Integer;
[...]
end Foo;
мы не знаем, что Foo.Value
вернется во время компиляции,и мы можем не знать до времени выполнения (что, если он читает значение из командной строки?), поэтому Foo.Value
должен быть в состоянии соответствия для вызова до того, как произойдет инициализация Bar
.
Инициализация Bar
происходит, когда разрабатывается Bar
, а также для Foo
, поэтому задача gnatbind
- распознать это и договориться о том, чтобы Foo
был разработан до Bar
.
Он делает это, отправляя вызовы кода разработки пакетов в функции (обычно называемой adanit
) и main()
, который должен вызываться операционной системой и вызывая adainit
, а затем основную программу Ada,скажем program.adb
.
gnatmake
, затем вызывает gnatlink
, который принимает сгенерированный gnatbind
код, в Ada в файлах с именами b-program.ad[sb]
или b__program.ad[sb]
или b~program.ad[sb]
в зависимости от года изготовления винакомпилятора, компилирует его и связывает с закрытием программы для созданияокончательный исполняемый файл.