我正在尝试使用GNAT Programming Suite(在Win XP上托管)在构建期间解析包引用。在Builder Results中,我收到类似这样的错误:
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"
我没有看到对“miimal”开关的引用。
在这种情况下,没有相应的正文文件 D_Ac_Config_S.Ada 。所以没有单独编译的正文文件。
当我右键单击 with 中的包引用时,我可以转到 Ac_Configuration 的声明以及作为错误来源的所有其他包名称。所以这些引用正以某种方式得到解决。
顺便说一句,我之前没有使用过ADA,所以我仍然想要了解一切。
答案 0 :(得分:2)
看起来好像你使用_s.ada
作为规范的后缀,而我猜测_b.ada
是否有身体?
GNAT可能难以使用此命名约定。使用GNAT Project文件(.gpr
)可以使用alter GNAT's default convention({unit-name}.ads
用于规范,{unit-name}.adb
用于实体),但规则(请参阅“Spec_Suffix”) )说“它不能以下划线后面跟一个字母数字字符开头”(我没试过这个,但你可以看到,如果你有一个包Foo_S
,它会混淆问题)。
后来:事实证明GNAT(GPL,4.7,4.8)对你的后缀非常满意!
如果包Ac_Configuration
实际上是D_Ac_Config_S.Ada
第85行声明的本地包,那么就是你的问题;你只能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
所有来源并完成它?
答案 1 :(得分:0)
您是否尝试过编译[“拥有”]文件D_Ac_Config_S.Ada
? (即如果它是一个规范,请转到相应的主体并编译它。)这应该强制更新其ALI /目标文件。
然后尝试正常建设。
- PS:您可能需要先清理。