У меня проблемы с Dynami c и Stati c, связывающими библиотеку в Аде. Я подготовил минимальный рабочий пример. Эти три файла определяют библиотеку, которая выводит «Hello world»:
helloworld_lib.gpr :
project Helloworld_Lib is
for Library_Name use "helloworld_lib";
for Source_Files use ("helloworld_lib.adb", "helloworld_lib.ads");
for Library_Kind use "static";
for Library_Dir use "obj";
end Helloworld_Lib;
helloworld_lib.adb :
with Ada.Text_IO;
package body helloworld_lib is
procedure Hello is
begin
Ada.Text_IO.Put_Line("Hello world");
end Hello;
end helloworld_lib;
helloworld_lib.ads :
with Ada.Text_IO;
use Ada.Text_IO;
package helloworld_lib is
procedure Hello;
end helloworld_lib;
Эти два файла определяют проект, который импортирует библиотеку и выполняет ее:
helloworld_interface .gpr :
with "helloworld_lib.gpr";
project Helloworld_Interface is
for Create_Missing_Dirs use "True";
for Main use ("helloworld_interface.adb");
for Source_Files use ("helloworld_interface.adb");
for Object_Dir use "obj";
end Helloworld_Interface;
helloworld_interface.adb :
with helloworld_lib; use helloworld_lib;
procedure helloworld_interface is
begin
Hello;
end helloworld_interface;
Я использую GPS 19.1 GNAT Community Edition на Windows. Если helloworld_interface.gpr открыт и «Build All» запускается, исполняемый файл компилируется, который работает, как ожидается, и полностью автономен.
Если мы изменим Library_Kind
с static
на dynamic
в helloworld_lib.gpr и сборка, как и раньше, exe и dll компилируются. Однако скомпилированные файлы теперь имеют зависимость от libgnat-2019.dll
и libgcc_s_seh-1.dll
. Программа не будет работать без этих библиотек DLL, которые можно скопировать из C:\GNAT\2019\bin
.
Учитывая, что можно создать связанный EXE-файл stati c, который работает без других зависимостей, как этот пример может быть скомпилирован в EXE и DLL без других зависимостей? Почему сейчас нужны эти две дополнительные библиотеки DLL?