Проблема с компиляцией Ada (ищу adbs, которых у меня нет?)

#static #static-libraries #ada #gnat #data-distribution-service

#статический #статические библиотеки #ada #gnat #служба распространения данных

Вопрос:

Я пытаюсь скомпилировать библиотеку третьей части в мое существующее приложение, используя gnatmake.. И я получаю эту ошибку:

 gnatmake: "dds.adb" not found
gnatmake: "dds-domainparticipant.adb" not found
gnatmake: "dds-domainparticipantfactory.adb" not found
gnatmake: "dds-publisher.adb" not found
gnatmake: "dds-topic.adb" not found
gnatmake: "dds-publisher_impl.adb" not found
gnatmake: "dds-datawriter_impl.adb" not found
gnatmake: "dds-domainparticipant_impl.adb" not found
gnatmake: "dds-readcondition_impl.adb" not found
gnatmake: "dds-datareader_impl.adb" not found
gnatmake: "dds-subscriber.adb" not found
gnatmake: "dds-condition.adb" not found
gnatmake: "dds-datareader.adb" not found
gnatmake: "dds-statuscondition.adb" not found
  

Я добавил их в gnatmake, который создает adp. -I содержит все спецификации (файлы.ads), а libnddsadad содержит все o-файлы:

        -I/lib/ndds.4.5d/include/ndds/dds_ada 
       -I/lib/ndds.4.5d/include/ndds/dds_ada/support     
       -I/lib/ndds.4.5d/include/ndds/dds_ada/support/low-level 

       /lib/Linux/ndds.4.5d/lib/GNATgcc/static/debug/libnddsadad.a 
  

Зачем ему нужны фактические файлы тела? Разве файла specs .a недостаточно? Как я могу обойти это?

Ответ №1:

Спецификаций и библиотеки архива недостаточно. Вам нужно указать расположение файлов .ali. Также попробуйте использовать флаги -aI и -aL вместо -I.

Комментарии:

1. Смотрите также, переключатели пути поиска в источнике и библиотеке

Ответ №2:

Вам нужно указать:

-largs switches : Переключатели компоновщика, где switches это список переключателей, которые являются допустимыми переключателями для gnatlink .

-Ldir : Добавьте каталог dir в список каталогов, в которых компоновщик будет искать библиотеки.

Например,

 -largs -L/lib/Linux/ndds.4.5d/lib/GNATgcc/static/debug -lnddsadad
  

Дополнение: Вы также можете посмотреть на

-Adir : Эквивалентно -aLdir -aIdir .

Ответ №3:

Вы могли бы создать файл проекта gnat для библиотеки, что-то вроде этого:

 project DDS_Lib is
   for Source_Dirs use ("/usr/include/dds_path");
   for Library_Name use "nddsadad";
   for Library_Dir use "/usr/lib/dds_path";
   for Library_ALI_Dir use "/usr/lib/dds_ali_path";
   for Externally_Built use "true";
end DDS_Lib;
  

и затем в вашем файле проекта добавьте with "dds_lib.gpr"; в начале. Вам не нужно ничего добавлять к вашим флагам компоновщика, чтобы связать с этой библиотекой, поскольку это делается автоматически.

Хорошие библиотеки Ada уже предоставляют такой файл gpr, который должен быть установлен по стандартному пути поиска (например, / usr / lib / gnat /). Если он установлен по нестандартному пути, вы можете добавить путь к ADA_PROJECT_PATH переменной среды.

Комментарии:

1. У меня аналогичная проблема с OP, но с пользовательским файлом .a, который я создал сам, и ваше решение построено нормально — но когда я пытаюсь добавить with LibraryName; в свой код, компилятор по-прежнему ищет .ads вместо файла .a. Я пытаюсь сделать это с помощью двоичного файла .a, в котором теоретически у меня нет .ali. Есть ли способ заставить это работать, которого мне не хватает?