0

我正在尝试使用 GNAT Programming Suite(托管在 Win XP 上)在构建期间解决包引用。在生成器结果中,我收到这样的错误:

file "ac_configuration_s.ada" not found

单击错误会将我带到这样的一行:

with

    Ac_Configuration,
    Dispense_Timer,
    ...

第一项 (Ac_Configuration) 未解决,但第二项 (Dispense_Time) 已解决。我还有其他几个解决或不解决的问题。所有有问题的文件(规范和正文)都被标识为源文件。

当我将鼠标悬停在出现错误的行上时,会出现一个弹出窗口,提供以下信息:

(Cross-references info not up to date. This is a guess.)
Ac_Configuration
local package declared at D_Ac_Config_S.Ada:85

猜测是正确的,但我不知道如何使用它。我如何才能正确构建它?

更新

这是对 gcc 的调用

gcc -c "-gnatec=C:\Source\build\GNAT-TEMP-000001.TMP" -I- -gnatA
-x ada "-gnatem=C:\Source\build\GNAT-TEMP-000002.TMP" "C:\Source\C_Cbt_Main_B.Ada"

我没有看到对“最小”开关的引用。

在这种情况下,没有相应的正文文件文件D_Ac_Config_S.Ada。所以没有要单独编译的正文文件。

当我右键单击with内的包引用时,我可以转到Ac_Configuration的声明以及作为错误来源的所有其他包名称。所以这些 lreferences 正在以某种方式解决。

顺便说一句,我以前没有使用过 ADA,所以我还在努力了解一切。

4

2 回答 2

2

看起来好像您正在_s.ada用作规格的后缀,而我猜_b.ada是身体?

GNAT 可能对这种命名约定有困难。使用GNAT项目文件.gpr(_ _ _ t 试过这个,但你可以看到,如果你有一个包,它会混淆问题,例如)。 稍后:事实证明 GNAT (GPL, 4.7, 4.8) 对你的后缀非常满意!{unit-name}.ads{unit-name}.adbFoo_S

如果包Ac_Configuration真的是在第 85 行声明的本地包D_Ac_Config_S.Ada,那么问题就来了;您只能使用with一个库单元,在本例中为D_Ac_Config.

with D_Ac_Config;
...
package Foo is
   ...
   Bar : D_Ac_Config.Ac_Configuration.Baz;

我想知道D_Ac_Config_S.Ada(例如)是否实际上包含多个 Ada 单元?(如果是这样,编译该文件应该会导致编译错误,例如end of file expected, file can have only one compilation unit)。GNAT 在编译时不支持这一点,而是提供了一个实用程序gnatchop

是否有可能只使用gnatchop所有来源并完成它?

于 2013-02-13T21:58:32.107 回答
0

嗯,我认为这听起来像编译器有一组错误的对象/ALI 正在使用,因此交叉引用不是最新的错误。(通常编译器擅长保持最新状态;但您可能需要检查是否为项目设置了“最小重新编译”开关。)

您是否尝试过仅编译 ["owning"] 文件D_Ac_Config_S.Ada?(即,如果它是一个规范,请转到相应的正文并对其进行编译。)这应该会强制更新其 ALI/目标文件。

然后尝试正常构建。

-- PS:你可能需要先清理一下。

于 2013-02-13T21:33:00.770 回答