0

Ada 对我来说还是个新手,所以我试图在 GPS IDE 中找到自己的方法。我之前问了另一个问题,但我认为这个问题优先于那个问题,并且可能是我问题的根源。

当我编译时,我得到一长串 *warning: source file ... not found"

在我的 .gpr 文件中,我列出了所有规范和正文源文件,并使用以下命名方案:

package Naming is
   for Casing               use "mixedcase";
   for Dot_Replacement      use ".";
   for Spec_Suffix ("ada")  use "_s.ada";
   for Body_Suffix ("ada")  use "_b.ada";
end Naming;

奇怪的是,错误消息看起来都像这样:

warning: source file "xxx_b.adb" not found

或这个

warning: source file "xxx.adb" not found

请注意,这些(xxxb.adb 或 xxx.adb)都不符合文件规范,文件规范应以 .ada 结尾。

有人可以解释这里发生了什么吗?

4

3 回答 3

1

我 99% 确定问题是我在回答您的另一个问题时提到的问题之一:GNAT 通常不支持文件中的多个编译单元。我得到了你用 GPS 和这些文件描述的行为:

james_s.ada:

with Jane;
package James is
end James;

jim_s.ada:

package Jim is
end Jim;
package Jane is
end Jane;

编译时的错误消息james_s.ada说它找不到Jane_s.ada,但是当我要求 GPS 去声明时,Jane它会把我带到jim_s.ada.

您可以使用gnatchopto split jim_s.ada,但它不理解项目文件或命名约定;您可能希望保留有效代码的现有名称,因此您可以gnatchop根据需要重命名 的输出。

然而!令我惊讶的是,事实证明 GNAT确实支持在一个文件中包含多个编译单元,项目文件中提供package Naming的项目文件告诉它文件中的每个单元:

package Naming is
   for Casing use "mixedcase";
   for Dot_Replacement use ".";
   for Spec_Suffix ("ada") use "_s.ada";
   for Body_Suffix ("ada") use "_b.ada";
   for Spec ("Jim") use "jim_s.ada" at 1;
   for Spec ("Jane") use "jim_s.ada" at 2;
end Naming;

gnatchop无论是在多单元文件还是在整个源代码树上执行此操作还是硬着头皮使用 ,都取决于您。

于 2013-02-15T14:48:25.640 回答
1

首先,这不是 Ada 问题,而是Gnat问题。其他 Ada 编译器对您使用的文件名没有问题。

然而,Gnat 的独特之处在于它希望每个源文件只有一个程序单元(包体、包规范、独立例程等)。这是因为它也是相当独特的,因为它希望能够仅通过知道该单元的 Ada 意向符就能够找到任何程序单元的源代码。大多数其他 Ada 编译器维护某种将文件名映射到程序单元的库文件,您必须将所有文件注册到其中。(而您的典型 C 编译器只是将查找所有代码文件的问题完全留给了用户)。

一般来说,使用 Gnat 最简单的方法是使用它的默认文件命名约定(当然不要将多个程序单元放在一个文件中),这种方法会给您带来最少的麻烦。

如果您已经有一些现有的 Ada 代码(可能是为另一个编译器开发的),将其导入 Gnat 的最简单方法通常是在其上运行gnatchop工具。所以这就是我建议你尝试的方法。

于 2013-02-15T19:21:09.663 回答
1

来自GPRbuild 用户指南

字符串用于属性值或这些属性的索引。它们通常区分大小写,除非另有说明 [...]

基于此,我相信您必须使用"Ada"而不是"ada"作为索引Spec_SuffixBody_Suffix。我目前无法使用测试工具,所以我建议尝试一下。

于 2013-02-18T09:53:22.083 回答