我想知道在使用Ada代码时绑定和链接之间的根本区别是什么?我在谷歌上找不到一个好的解释,这就是我提出这个问题的原因。
对于绑定过程,输入是什么,输出是什么? 绑定和链接之间有什么关系?我认为首先需要进行绑定。
谢谢, 波格丹。
答案 0 :(得分:6)
使用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;
我们不知道Foo.Value
在编译时会返回什么,我们可能直到运行时才会知道(如果它从命令行读取值会怎样?),所以Foo.Value
在Bar
初始化发生之前,必须处于适合状态。
Bar
的初始化在Bar
详细阐述时发生,同样适用于Foo
,所以gnatbind
的工作就是认识到这一点并安排Foo
在Bar
之前详细说明。
它通过在函数(通常称为adanit
)和main()
中调用包的精简代码来执行此操作,该adainit
将由操作系统调用并调用{{1}然后是Ada主程序,说program.adb
。
gnatmake
然后在Ada的gnatlink
或gnatbind
或b-program.ad[sb]
文件中调用b__program.ad[sb]
,其中包含b~program.ad[sb]
生成的代码根据编译器的年份,编译它,并将其与程序的闭包链接以生成最终的可执行文件。
答案 1 :(得分:4)
您可以将其视为内置make但没有重新编译:它确保对象一致,生成正确的初始化顺序,编译它,并将所有内容传递给链接器。
正如所指出的,在Ada中,程序入口点不是您的主程序,而是执行安全初始化然后调用主程序的程序。