GNAT Programming Suite: информация о перекрестных ссылках не актуальна (это предположение)

Я пытаюсь разрешить ссылки на пакеты во время сборки, используя GNAT Programming Suite (размещенный на Win XP). В результатах Builder я получаю такие ошибки:

file "ac_configuration_s.ada" not found

Нажав на ошибку, я попаду на такую ​​строку:

with

    Ac_Configuration,
    Dispense_Timer,
    ...

Первый элемент (Ac_Configuration) не разрешен, но разрешен второй элемент (Dispense_Time). У меня есть несколько других, которые решают или не разрешают. Все рассматриваемые файлы (spec и body) идентифицируются как исходные файлы.

Когда я навожу указатель мыши на строку с ошибкой, появляется всплывающее окно, предлагающее это:

(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 и любому другому имени пакета, который является источником ошибки. Так что эти ссылки каким-то образом решаются.

Кстати, я раньше не пользовался ADA, поэтому пока пытаюсь во всем разобраться.


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


Ответы (2)


Похоже, вы используете _s.ada в качестве суффикса для спецификаций, и я предполагаю, что _b.ada для тел?

У GNAT могут возникнуть трудности с этим соглашением об именах. Используя файл проекта GNAT (.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 (например) содержит несколько единиц языка Ада? (если это так, компиляция этого файла должна привести к ошибке компиляции, такой как 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/object.

Затем попробуйте построить как обычно.

-- PS: возможно, вам придется сначала почистить.

person Shark8    schedule 13.02.2013
comment
Чтобы проверить Minimal Recompilation, перейдите к ProjectEdit Project Properties, затем перейдите на вкладку Switches в появившемся диалоговом окне, это должна быть вкладка по умолчанию (gnatmake) на этой вкладке. - person Shark8; 14.02.2013