答案 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。