#c #ada #gnat #gprbuild
#c #ada #gnat #gprbuild
Вопрос:
Я обновился до GNAT Community 2018 (с GNAT GPL 2017 все работало нормально). У меня есть этот файл проекта:
with "opengl";
library project OpenGL.Soil is
for Library_Name use "SoilAda";
for Languages use ("ada", "c");
for Source_Dirs use ("src/soil");
-- snip compiler config
end OpenGL.Soil;
Теперь в src/soil
есть пара файлов .ads
и .adb
, а также файлы .h
and .c
. Ранее этот файл проекта компилировал их все и просто связывал вместе при использовании. Начиная с GNAT Community 2018, этот файл компилирует только исходные тексты Ada, а не исходные тексты C.
Вещи, которые я пробовал:
- Убедитесь, что GCC, поставляемый с GNAT Community, по-прежнему поддерживает компиляцию C. Да, это так.
- Явно определенная
Naming
настройка пакетаSpec_Suffix
иImplementation_Suffix
для C для соответствующих окончаний файлов. - Явно указано
Source_Files
и поместите в него все файлы Ada и C.
Что бы я ни делал, GPRBuild при вызове не будет компилировать файлы C (что приводит к ошибкам компоновщика). В отношении файлов C не выводится ошибка или предупреждение, даже если они явно указаны.
Как я могу заставить GPRBuild снова скомпилировать файлы C?
Ответ №1:
Причина заключалась в том, что все еще оставались 32-битные объектные файлы от предыдущего компилятора. GPRBuild не перекомпилировал их, но также не пытался связать их (что привело бы к неудаче), вызвав gprclean -r
проект и скомпилировав его снова, исправил это.
Комментарии:
1. Еще одна забавная проблема заключается в наличии разных блоков в зависимости от настроек переменной сценария; gprclean не удалит объекты, которых не было бы в текущем сценарии.
rm .build/*
2. @SimonWright Чтобы обойти это, я указываю уникальный каталог объектов для каждой переменной сценария.