为了了解 Ada 程序编译背后的过程(不诉诸使用gpr),我决定手动编译我的一个项目。为了编译程序,我对.adb其中的每个文件运行以下命令(但是不是手动):
$ gcc -c src/<file>.adb -o obj/<file>.o
这会编译所有文件并将它们放入obj目录中。
或者更确切地说,会的。这有一个小问题。我有一个从另一个项目生成的存档(静态库),名为libapples.a,包含 package Apples。Apples您在上面看到我编译的文件使用了该包。
由于libapples.a不再有源文件(鉴于其存档格式),因此使用-I开关向上述命令提供该库的源是不可行的(甚至不可能);另一方面,如果我没有包含源代码,上面的命令会返回给我:
<file>.adb:<y>:<x>: file "apples.ads" not found
gnatmake: "src/<file>.adb" compilation error
我尝试使用标志-L和将库包含在编译过程中l(我相信这就是您在 C 中的做法;如果我错了,请随时纠正我)。在另一次尝试中,我将存档放在源目录中。
如何在编译过程中包含一个库?
apples.ads有点像 C 中的标头,您的文件编译时肯定需要它。您应该使用将 gcc 指向所在-I目录。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如果您能找出正确的参数,您可能可以编译手动生成的包,然后调用链接器。