Пакет за програмиране GNAT: Информацията за кръстосана препратка не е актуална (това е предположение)

Опитвам се да разреша препратките към пакети по време на компилация, използвайки GNAT Programming Suite (хостван на Win XP). В резултатите на Builder получавам грешки като тази:

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 преди, така че все още се опитвам да разбера всичко.


person Jim    schedule 13.02.2013    source източник


Отговори (2)


Изглежда, че използвате _s.ada като суфикс за спецификации и предполагам _b.ada за тела?

GNAT може да има трудности с тази конвенция за именуване. Възможно е с помощта на GNAT Project файл (.gpr), да промяна на конвенцията по подразбиране на GNAT ({unit-name}.ads за спецификации, {unit-name}.adb за тела), но правила (вижте „Spec_Suffix“) казват „Не може да започва с долна черта, последвана от буквено-цифров знак“ (не съм опитвал това, но можете да видите, че би объркало проблема, ако имате пакет Foo_S, например).
ПО-КЪСНО: Оказва се, че GNAT (GPL, 4.7, 4.8) е доста доволен от вашите суфикси!

Ако пакетът 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 целия източник и да приключим с него?

person Simon Wright    schedule 13.02.2013
comment
Прав си за именуването и суфиксите. Ще трябва да помисля какво казваш. Това е внедрен код, който наследих. Така че се чудя дали има някакъв вариант на версията, който може да обясни това, което казвате, че проблемът е работил в миналото. Няколко от грешките обаче изглеждат последователни по този начин. - person Jim; 14.02.2013

Хм, мисля, че звучи така, сякаш компилаторът има лош набор от обекти/ALI, с които работи, следователно кръстосаната препратка не е актуална грешка. (Обикновено компилаторът е добър в поддържането на нещата актуални; но може да искате да проверите дали превключвателят „минимално повторно компилиране“ е зададен за проекта.)

Опитахте ли да компилирате само файла ["притежаване"] D_Ac_Config_S.Ada? (т.е. ако беше спецификация, отидете до съответното тяло и го компилирайте.) Това трябва да принуди неговите ALI/обектни файлове да бъдат актуализирани.

След това опитайте да изградите както обикновено.

-- PS: може да се наложи първо да почистите.

person Shark8    schedule 13.02.2013
comment
За да проверите Minimal Recompilation отидете на ProjectEdit Project Properties, след това отидете на раздела Switches на диалоговия прозорец, който се появява, това трябва да е разделът по подразбиране (gnatmake) под този раздел. - person Shark8; 14.02.2013