Компиляция со статической библиотекой с использованием GNAT - PullRequest
0 голосов
/ 11 декабря 2018

Чтобы изучить процессы компиляции программ Ada (не прибегая к использованию gpr), я решил скомпилировать один из моих проектов вручную.Чтобы скомпилировать программу, я запускаю следующую команду для каждого .adb файла (но не вручную):

$ gcc -c src/<file>.adb -o obj/<file>.o

, который компилирует все файлыи помещает их в каталог obj.

Вернее, так и будет.Есть небольшая проблема с этим.У меня есть архив (статическая библиотека), который я сгенерировал из другого проекта под названием libapples.a, содержащий пакет Apples.Пакет Apples используется файлами, которые вы видите во время компиляции выше.

Поскольку libapples.a больше не имеет исходных файлов (с учетом формата архива), его невозможно (даже невозможно) предоставитьисходники этой библиотеки для команды выше, используя -I переключатели;с другой стороны, если у меня нет включенных источников, приведенная выше команда возвращается ко мне со словами:

<file>.adb:<y>:<x>: file "apples.ads" not found
gnatmake: "src/<file>.adb" compilation error

Я попытался включить библиотеку в процесс компиляции, используя флаги -L и l (я верю, что вы сделаете это в C; не стесняйтесь исправлять меня, если я ошибаюсь).В другой попытке я поместил архив прямо в исходный каталог.

Как можно включить библиотеку в процесс компиляции?

1 Ответ

0 голосов
/ 11 декабря 2018

apples.ads чем-то напоминает заголовок в C, и он определенно нужен для компиляции вашего файла.Вы должны использовать -I, чтобы указать gcc на каталог, в котором находится apples.ads.

Помните, что компиляция источника Ada не только дает объектный файл, но и информацию библиотеки Ada (.ali) файл.Это понадобится вам для следующего шага.Вы не должны использовать флаг -o, поскольку это может привести к тому, что ваши .o и .ali файлы будут иметь разные имена.

С другой стороны, поскольку вы хотите создать только объектный файл, вам следуетиспользуйте -c, чтобы указать gcc только компилировать.В других языках, таких как C, gcc компилирует и ссылки по умолчанию;в Аде процесс более сложный.

После компиляции вам нужно вызвать gnatbind в файле .ali вашей основной программы.Это создает пакет, который позаботится о правильной инициализации всего.Для этого gnatbind нужен файл .ali пакета Apples!Вы можете указать .ali каталог поиска с помощью -aO.

Наконец, gnatlink, вызываемый в основном файле .ali, свяжет все вместе.Он сам определяет, какие объектные файлы и библиотеки ему нужны.Он добавит необходимые параметры к компоновщику, включая ссылку на libapples.a.Он также компилирует пакет, сгенерированный gnatlink.

Я не знаю точно, что gnatlink сделает под капотом;Вы могли бы, вероятно, скомпилировать пакет, сгенерированный gnatbind вручную, а затем вызвать компоновщик, если сможете найти правильные аргументы.

...