我如何 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
.
所以这是一个简单的项目,我放在一起只是为了测试,然后再用它做一些很酷的事情。最终的目标是通过牛逼的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
.