GNAT Programming Suite - 找不到源文件

时间:2013-02-14 19:11:04

标签: ada gnat

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

当我编译时,我得到一个很长的*警告列表:源文件......找不到“

在我的.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结尾。

有人能解释一下这里发生了什么吗?

3 个答案:

答案 0 :(得分: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

您可以使用gnatchop拆分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

答案 1 :(得分:1)

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

然而,Gnat相当独特,因为它希望每个源文件只有一个程序单元(包体,包规范,独立例程等)。这是因为它也非常独特,因为它希望能够通过知道单元的Ada标识符来找到任何程序单元的源代码。大多数其他Ada编译器维护某种库文件,将文件名映射到程序单元,您必须将所有文件注册到其中。 (而您的典型C编译器只会为您的所有代码找到完全找到文件的问题。)

一般来说,使用Gnat最简单的方法就是使用它的默认文件命名约定(当然不要将多个程序单元放在一个文件中。

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

答案 2 :(得分:1)

来自GPRbuild User's Guide

  

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

基于此,我认为您必须使用"Ada"代替"ada"作为Spec_SuffixBody_Suffix的索引。我目前无法访问测试工具,因此我建议您试一试。