我想知道在使用Ada代码时绑定和链接之间的根本区别是什么?我在谷歌上找不到一个好的解释,这就是为什么我问这个问题.
对于绑定过程,输入是什么,输出是什么?绑定和链接之间有什么关系?我认为首先需要进行绑定.
谢谢,波格丹.
使用GNAT,绑定器执行两个作业:首先,检查所有必要的编译是否已完成,以便程序的关闭是一致的,其次安排进行详细说明(任何Ada构建系统都需要这些作业,但它们可能以不同的方式实施).
使用时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;
Run Code Online (Sandbox Code Playgroud)
我们不知道Foo.Value在编译时会返回什么,我们可能直到运行时才知道(如果它从命令行读取一个值?),所以Foo.Value必须处于拟合状态才能在Bar初始化之前调用发生.
Bar初始化发生在Bar详细阐述的时候,同样也是如此Foo,所以gnatbind认识到这一点并安排Foo之前已经详细说明了Bar.
它通过在函数(通常称为adanit)中发出对包的精化代码的调用来实现这一点,并且a main()将由操作系统调用adainit并调用,然后调用Ada主程序program.adb.
gnatmake然后调用gnatlink,gnatbind在Ada中调用生成的代码,在调用的文件中b-program.ad[sb],b__program.ad[sb]或者b~program.ad[sb]根据编译器的复古程序,编译它,并将其与程序的闭包链接,以生成最终的可执行文件.
请参阅此处列出的四点:https : //docs.adacore.com/gnat_ugn-docs/html/gnat_ugn/gnat_ugn/building_executable_programs_with_gnat.html#binding-with-gnatbind
您可以将其视为内置的make,但无需重新编译:它可确保对象一致,生成正确的初始化顺序,对其进行编译并将所有内容传递给链接器。
如前所述,在Ada中,程序入口点不是您的主过程,而是执行安全初始化然后调用您的主过程的入口。