gpt4 book ai didi

ada - 使用 GNAT 编译静态库

转载 作者:行者123 更新时间:2023-12-02 20:10:28 24 4
gpt4 key购买 nike

为了了解 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

我尝试使用标志 -L 在编译过程中包含该库和l (我相信这就是你在 C 中的做法;如果我错了,请随时纠正我)。在另一次尝试中,我将存档放在源目录中。

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

最佳答案

apples.ads 有点像 C 语言中的 header ,您的文件编译时肯定需要它。您应该使用 -I 将 gcc 指向 apples.ads 所在的目录。

请注意,编译 Ada 源不仅会生成目标文件,还会生成 Ada 库信息 (.ali) 文件。下一步您将需要它。您不应使用 -o 标志,因为它可能会导致您的 .o.ali 文件具有不同的名称。

另一方面,由于您只想生成一个目标文件,因此应该使用 -c 告诉 gcc 仅进行编译。在其他语言如C中,gcc默认编译和链接;在Ada中,这个过程更加复杂。

编译后,您需要在主程序的.ali文件上调用gnatbind。这会生成一个包,它将负责所有内容的正确初始化。为此,gnatbind 需要 Apples 包的 .ali 文件!您可以使用-aO指定.ali搜索目录。

最后,在主 .ali 文件上调用的 gnatlink 会将所有内容链接在一起。它会自行计算出需要哪些目标文件和库。它将向链接器附加必要的选项,包括对 libapples.a 的引用。它还编译 gnatlink 生成的包。

我不知道 gnatlink 到底会做什么;您可以手动编译由 gnatbind 生成的包,然后如果您能找出正确的参数,则调用链接器。

关于ada - 使用 GNAT 编译静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53725893/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com