使用GNAT使用静态库进行编译

时间:2018-12-11 14:09:14

标签: ada gnat

要了解Ada程序编译背后的过程(无需使用gpr),我决定手动编译我的一个项目。要编译程序,我在其中的每个.adb文件上运行以下命令(但是,不是手动进行):

  

$ gcc -c src/<file>.adb -o obj/<file>.o

这将编译所有文件,并将它们放在obj目录中。

或者,它将。这有一个小问题。我有一个从另一个项目libapples.a生成的归档文件(静态库),其中包含软件包ApplesApples软件包由您在上面看到的我编译的文件使用。

由于libapples.a不再具有源文件(考虑到其存档格式),因此无法使用(甚至不可能)使用-I开关将该库的源提供给上述命令;另一方面,如果我没有提供这些资源,则上面的命令会再次对我说:

  

<file>.adb:<y>:<x>: file "apples.ads" not found
  gnatmake: "src/<file>.adb" compilation error

我试图通过使用标志-Ll将库包含在编译过程中(我相信这是您在C语言中的做法;如果我愿意,请随时纠正我是错误的)。在另一种尝试中,我将存档直接放在源目录中。

在编译过程中如何包括一个库?

1 个答案:

答案 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生成的包,如果可以找出正确的参数,则可以调用链接器。