如何使用gnatmake和Ada共享库编译和链接?

时间:2010-10-10 23:09:23

标签: ada gnat

3 个答案:

答案 0 :(得分:6)

好吧,这结果很痛苦,但我发现了。

Florist绑定既可用作共享库,也可用作静态库(均已安装)。您需要链接到库以解析所有引用(我实际上永远无法将库源代码编译到我的应用程序中)。一旦你传递了参数来告诉编译阶段关于库你必须提供要解决的.ads(至少)文件。

最终的解决方案就是:

gnatmake -aI/usr/share/ada/adainclude/florist -aO/usr/lib/ada/adalib/florist demo.adb -largs -lflorist

-aI提供了图书馆广告文件的路径。 -aO提供了(在这种情况下)libflorist.so库文件的路径,最后(这是棘手的)你必须通过-lflorist来告诉它共享库是什么。但是通过它将无法正常工作。您必须在它前面放置一个-largs(用于编译和链接器),以便为编译阶段传递参数!没有它,那些阶段永远不会看到这个论点!

所以你就是每个人!为了在Linux(GCC)下针对共享的Ada库编译和链接代码,您需要提供Library的Headers / Specs,Library位置和-llibname参数以及-largs以将它们传递到正确的位置! / p>

我现在很高兴。希望这有助于其他人。

答案 1 :(得分:2)

这是使用GNAT项目与Florist一起构建的简单示例。我假设$ADA_PROJECT_PATH包含安装florist.gpr的目录(在我的情况下,$HOME/local/lib/gnat)。

示例程序(我在网上找不到任何简单的花店演示,有没有?),在id.adb中:

with POSIX.Process_Identification;
with Ada.Text_IO; use Ada.Text_IO;
procedure Id is
begin
   Put_Line (POSIX.To_String (POSIX.Process_Identification.Get_Login_Name));
end Id;

项目文件(id.gpr),与id.adb在同一目录中:

with "florist";
project Id is
   for Main use ("id.adb");
   for Object_Dir use ".build_id";
   for Exec_Dir use ".";
end Id;

使用

构建
$ gnatmake -p -P id.gpr
object directory "/Users/simon/florist-gpl-2010-src/demo/.build_id" created for project id
gcc -c -I- -gnatA /Users/simon/florist-gpl-2010-src/demo/id.adb
gnatbind -I- -x /Users/simon/florist-gpl-2010-src/demo/.build_id/id.ali
gnatlink /Users/simon/florist-gpl-2010-src/demo/.build_id/id.ali -lflorist -o /Users/simon/florist-gpl-2010-src/demo/id

并运行:

$ ./id
simon

答案 2 :(得分:1)

看起来漂亮的花园种类链接错误。你的.h文件,你的Ada目标文件和你的C链接库之间的东西并没有完全匹配。虽然很难说清楚。

您最好的选择是寻找可能遇到同样问题的其他花店用户。他们的项目页面是on SourceForge here,但看起来它在过去的6年中并没有非常活跃。由于最新版本有旧版本,可能需要一个旧版本的编译器(和操作系统?)。 ICK。