如何在Ada中链接自定义dll?

时间:2017-03-24 04:15:27

标签: dll ada gnat

所以这是一个简单的项目,我把它放在一起测试,然后再做一些很酷的东西。最终的目标是使程序能够通过令人敬畏的dll kung fu处理模块化。

但是,宝贝步骤。现在我只想把事情联系起来。

我在这里有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;

令人兴奋,我知道。

我已经看过几个关于如何做到这一点的不同教程,并且没有人同意,但是从this one得到提示,我想出了这些命令:

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

这至少会生成 a 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的规格,我想出了上面的&#d; 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

使用此特定命令,它会向"添加'""'''''错误。如果我添加-v标志,它不会提供更多有用的信息。

检查gnatmake --help告诉我默认模式是gnat 2012,如果这有任何区别。它可能不应该,因为我也尝试使用2005和95的标志进行编译。

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

2 个答案:

答案 0 :(得分:3)

如果你想说

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的内容。

答案 1 :(得分:0)

我建议您按照" Ada插件和共享库"中的说明进行操作。来自AdaCore的(part 1part 2)。

我已经使用了那里描述的技术,并且工作得非常好。