要了解Ada程序编译背后的过程(无需使用gpr
),我决定手动编译我的一个项目。要编译程序,我在其中的每个.adb
文件上运行以下命令(但是,不是手动进行):
$ gcc -c src/<file>.adb -o obj/<file>.o
这将编译所有文件,并将它们放在obj
目录中。
或者,它将。这有一个小问题。我有一个从另一个项目libapples.a
生成的归档文件(静态库),其中包含软件包Apples
。 Apples
软件包由您在上面看到的我编译的文件使用。
由于libapples.a
不再具有源文件(考虑到其存档格式),因此无法使用(甚至不可能)使用-I
开关将该库的源提供给上述命令;另一方面,如果我没有提供这些资源,则上面的命令会再次对我说:
<file>.adb:<y>:<x>: file "apples.ads" not found
gnatmake: "src/<file>.adb" compilation error
我试图通过使用标志-L
和l
将库包含在编译过程中(我相信这是您在C语言中的做法;如果我愿意,请随时纠正我是错误的)。在另一种尝试中,我将存档直接放在源目录中。
在编译过程中如何包括一个库?
答案 0 :(得分:4)
apples.ads
有点像C中的头文件,您肯定需要它才能编译文件。您应该使用-I
将gcc指向apples.ads
所在的目录。
请注意,编译Ada源代码不仅会生成目标文件,还会生成Ada库信息(.ali
)文件。下一步将需要它。您不应使用-o
标志,因为它可能导致您的.o
和.ali
文件具有不同的名称。
另一方面,由于您只想生成目标文件,因此应使用-c
来告诉gcc仅进行编译。在其他语言(例如C)中,gcc默认情况下进行编译和链接;在Ada中,过程更加复杂。
编译后,您需要在主程序的gnatbind
文件上调用.ali
。这将生成一个程序包,该程序包将适当地初始化所有内容。为此,gnatbind
需要.ali
软件包的Apples
文件!您可以使用.ali
指定-aO
搜索目录。
最后,在主gnatlink
文件上调用的.ali
将所有内容链接在一起。它自己确定需要哪些目标文件和库。它将必要的选项附加到链接器,包括对libapples.a
的引用。它还会编译gnatlink
生成的包。
我不知道gnatlink
到底会做什么?您可能可以手动编译gnatbind
生成的包,如果可以找出正确的参数,则可以调用链接器。