4

我在花店图书馆再次编译申请人时遇到了麻烦。原来我对花店有一个更大的问题(最新的 2010 Adacore GPL 下载和 Debian 存档中的 2009 版本都导致相同的错误)。Florist 有一些低级问题,但是当我查看生成的文件时,它似乎正确地包含了 errno.h。

这是我建立花店时发生的事情:

对“c_ntohs”的未定义引用 ./posix-io.o:在函数“posix__io__open”中:posix-io.adb:(.text+0x4d1):对“__gnat_florist_open”的未定义引用。/posix-io.o:在函数中posix__io__open_or_create': posix-io.adb:(.text+0xfca): undefined reference to `__gnat_florist_open' collect2: ld returned 1 exit status gnatlink: error when calling /usr/bin/gcc-4.4 gnatmake: *** link failed。josh@Mini10:~/Demo$ gnatbind -I/usr/share/ada/adainclude/florist -I/usr/include 演示 josh@Mini10:~/Demo$ gnatlink demo ./posix-implementation.o: 在函数 `posix__implementation__set_ada_error_code ': posix-implementation.adb:(.text+0x19e): 未定义引用 `store_errno' ./posix-implementation.o: 在函数 `posix__implementation__get_ada_error_code': posix-implementation.adb:(.text+0x1ab):

如果正确包含 errno.h 存在问题,则此错误似乎很常见。但据我从 posix-cc 文件中可以看出,这一切看起来都是正确的。有人对如何解决这个问题有任何建议吗?Florist 的 make 文件构建正确,所以我不知道这是从哪里来的。

4

3 回答 3

8

好的,结果证明这很痛苦,但我找到了。

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 库编译和链接代码,您需要提供库的标头/规范、库位置和 -llibname 参数以及 -largs 以将它们传递到正确的位置!

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

于 2010-10-12T16:20:46.937 回答
2

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

示例程序(我在网上找不到任何简单的 Florist 演示,有吗?),位于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
于 2010-10-13T19:16:14.917 回答
1

它看起来像漂亮的各种链接错误。您的 .h 文件、您的 Ada 目标文件和您的 C 链接库之间的某些内容并不完全匹配。很难说是什么。

您最好的选择是寻找可能遇到相同问题的其他 Florist 用户。他们的项目页面在 SourceForge 上,但看起来在过去 6 年里它并没有非常活跃。由于最新版本有那么旧,因此您可能需要一个那么旧的编译器(和操作系统?)才能使用它。伊克。

于 2010-10-11T15:13:41.447 回答