我如何 link Ada 中的自定义 dll?

How do I link a custom dll in Ada?

所以这是一个简单的项目,我放在一起只是为了测试,然后再用它做一些很酷的事情。最终的目标是通过牛逼的dll功夫让程序能够处理模块化。

但是,婴儿步骤。现在我只想做 link.

我这里有 Adder.ads:

package Adder is

    function Add(A : Integer; B : Integer) return Integer;

end Adder;

和各自的Adder.adb:

package body Adder is

    function Add(A : Integer; B : Integer) return Integer is
    begin
        return A + B;
    end Add;

end Adder;

令人兴奋,我知道。

我看过几个关于如何执行此操作的不同教程,其中 none 同意,但根据 this one 的提示,我想出了以下命令:

gnatmake -c Adder.adb
gcc -shared -shared-libgcc -o Adder.dll Adder.o

这至少会生成一个 dll。我不知道它是否生成了一个可以实际工作的文件,或者问题是否出在主 exe 上。

现在是主要的 exe,我将所有内容都保存在一个单独的目录中,这样 gnat 就不会试图欺骗和使用 .ali 和 .o 文件。然后在尝试构建之前将 dll 复制到目录中。我已经尝试了很多不同的调整方法并遇到了几个不同的错误,但这就是我现在所拥有的。

Main.adb:

with Adder_Spec; use Adder_Spec;
with Ada.Text_IO; use Ada.Text_IO;

procedure Main is
begin
    Put_Line(Integer'Image(Add(3,4)));
end Main;

是的,有史以来最无用的程序。现在,知道我应该有一个 dll 规范,我想出了前面的 Adder_Spec.ads:

package Adder_Spec is

    function Add(A : Integer; B : Integer) return Integer;

private

    pragma Import(Ada, Add, "Add");

end Adder_Spec;

现在,就像我说的那样,我尝试了很多不同的方法,有时省略第三个导入参数,有时完全省略导入,有时保留导入但不将其分离到私有部分,你说的它。我也尝试过多种方式来使用编译命令,但这是最近的一种:

gnatmake Main.adb -bargs -shared -largs -lAdder

对于这个特定的命令,它会吐出一个 "Undefined reference to 'Add'" 错误。如果我添加 -v 标志,它不会提供更多有用的信息。

检查 gnatmake --help 显示默认模式是 gnat 2012,如果这有什么不同的话。它可能不应该,因为我也尝试使用 2005 和 95 的标志进行编译。

所以...任何足够精明的人都可以发现问题吗?提前致谢。

我建议您按照 AdaCore "Ada Plug-ins and Shared Libraries" (part 1, part 2) 中的说明进行操作。

我已经使用了那里描述的技术,并且效果很好。

如果你想说

package Adder_Spec is
    function Add(A : Integer; B : Integer) return Integer;
private
    pragma Import(Ada, Add, "Add");
end Adder_Spec;

导入DLL的时候,那你就得说

package Adder is
    function Add(A : Integer; B : Integer) return Integer;
    pragma Export (Ada, Add, "Add");
end Adder;

构建时。

GNAT 生成的 Add 的默认链接器名称是(我认为)adder__add;你应该能够看到它在使用什么 nm Adder.o.