所以这是一个简单的项目,我把它放在一起测试,然后再做一些很酷的东西。最终的目标是使程序能够通过令人敬畏的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的标志进行编译。
所以...任何人都能够足够精明地发现问题吗?提前谢谢。
答案 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)