【问题标题】:GNAT Programming Suite - source file not foundGNAT 编程套件 - 未找到源文件
【发布时间】:2013-02-14 19:11:03
【问题描述】:

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 结尾。

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

【问题讨论】:

  • 除非您有一个复杂的构建环境,否则为什么不直接使用 GPS 项目向导来设置您的项目文件?这对我来说总是足够的。
  • 使用向导重新开始。这解决了这个问题。它没有解决与我的其他问题相关的问题,但这是进步。

标签: ada gnat


【解决方案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,在多单元文件或整个源代码树上。

【讨论】:

  • 您建议在 package Naming 中使用 for Spec 似乎有效。
【解决方案2】:

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

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

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

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

【讨论】:

  • 您(和西蒙)可能是正确的,这是 GNAT 的问题。知道代码已经发布了,它必须在正确的环境下正确编译。您是否对指出这种差异的 GNAT 规范有任何参考?
  • chapter 2.1 of the GNAT User Manualchapter 13的最后一段。 (顺便说一句,如果你说它已经发布了,那会有所帮助!)
【解决方案3】:

来自GPRbuild User's Guide

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多