Ada .text+0x34e):下面是对“fetch\u errno”的更多未定义引用 ./posix实现.o:在函数“nosys\u neg\u one”中: posix实现.adb:(.text+0xaef):对“store\u errno”的未定义引用 ./posix implementation.o:在函数“notsup_neg_one”中: posix实现.adb:(.text+0xb15):未定义对“store\u errno”的引用 ./posix implementation.o:在函数“posix\uuuu implementation\uuu restore\u signals\u和\u raise\u posix\u error”中: posix implementation.adb:(.text+0xc88):对“fetch\u errno”的未定义引用 ./posix.o:在函数“posix\u系统名称”中: posix.adb:(.text+0x2f98):未定义对“gnat”的引用 ./posix.o:在函数'posix\u\u node\u name'中: posix.adb:(.text+0x2fef):未定义对“\uu gnat\u florst\u uname”的引用 ./posix.o:在函数“posix_uu发布”中: posix.adb:(.text+0x3049):未定义对“gnat”的引用 ./posix.o:在函数“posix__版本”中: posix.adb:(.text+0x30a6):未定义对“gnat”的引用 ./posix.o:在函数“posix__机器”中: posix.adb:(.text+0x3103):未定义对`\u gnat\u florist\u uname'的引用 ./posix.o:在函数“posix主机到网络字节顺序”中: posix.adb:(.text+0x4627):对“c_htonl”的未定义引用 ./posix.o:在函数'posix_uu主机到网络字节顺序2'中: posix.adb:(.text+0x4642):对'c_htons'的未定义引用 ./posix.o:在函数“posix网络到主机字节顺序”中: posix.adb:(.text+0x4655):对“c_ntohl”的未定义引用 ./posix.o:在函数“posix\u网络到主机\u字节\u顺序\u 2”中: posix.adb:(.text+0x4670):对“c_ntohs”的未定义引用 /posix io.o:在函数“posix io打开”中: posix io.adb:(.text+0x4d1):未定义对“gnat花店开放”的引用 /posix io.o:在函数“posix\uuuu io\uuu open\u或\u create”中: posix io.adb:(.text+0xfca):未定义对“gnat花店开放”的引用 collect2:ld返回了1个退出状态 gnatlink:调用/usr/bin/gcc-4.4时出错

Ada .text+0x34e):下面是对“fetch\u errno”的更多未定义引用 ./posix实现.o:在函数“nosys\u neg\u one”中: posix实现.adb:(.text+0xaef):对“store\u errno”的未定义引用 ./posix implementation.o:在函数“notsup_neg_one”中: posix实现.adb:(.text+0xb15):未定义对“store\u errno”的引用 ./posix implementation.o:在函数“posix\uuuu implementation\uuu restore\u signals\u和\u raise\u posix\u error”中: posix implementation.adb:(.text+0xc88):对“fetch\u errno”的未定义引用 ./posix.o:在函数“posix\u系统名称”中: posix.adb:(.text+0x2f98):未定义对“gnat”的引用 ./posix.o:在函数'posix\u\u node\u name'中: posix.adb:(.text+0x2fef):未定义对“\uu gnat\u florst\u uname”的引用 ./posix.o:在函数“posix_uu发布”中: posix.adb:(.text+0x3049):未定义对“gnat”的引用 ./posix.o:在函数“posix__版本”中: posix.adb:(.text+0x30a6):未定义对“gnat”的引用 ./posix.o:在函数“posix__机器”中: posix.adb:(.text+0x3103):未定义对`\u gnat\u florist\u uname'的引用 ./posix.o:在函数“posix主机到网络字节顺序”中: posix.adb:(.text+0x4627):对“c_htonl”的未定义引用 ./posix.o:在函数'posix_uu主机到网络字节顺序2'中: posix.adb:(.text+0x4642):对'c_htons'的未定义引用 ./posix.o:在函数“posix网络到主机字节顺序”中: posix.adb:(.text+0x4655):对“c_ntohl”的未定义引用 ./posix.o:在函数“posix\u网络到主机\u字节\u顺序\u 2”中: posix.adb:(.text+0x4670):对“c_ntohs”的未定义引用 /posix io.o:在函数“posix io打开”中: posix io.adb:(.text+0x4d1):未定义对“gnat花店开放”的引用 /posix io.o:在函数“posix\uuuu io\uuu open\u或\u create”中: posix io.adb:(.text+0xfca):未定义对“gnat花店开放”的引用 collect2:ld返回了1个退出状态 gnatlink:调用/usr/bin/gcc-4.4时出错 ,ada,gnat,Ada,Gnat,如果正确包含errno.h,则此错误似乎很常见。但就我从posix-c.c文件中所知,这一切看起来都是正确的。有人对如何解决这个问题有什么建议吗?花店的make文件构建正确,所以我不知道这是从哪里来的。看起来像是漂亮的花园品种链接错误。您的.h文件、Ada对象文件和C链接库之间的某些内容并不完全匹配。但很难说是什么 你最好的选择是寻找可能遇到同样问题的其他花店用户。他们的项目页面很活跃,但看起来在过去的6年里它并没有那么活跃。由于那里的最新版本如此陈旧,您可能需要一个如此陈旧的编译器(和操作系统

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

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


你最好的选择是寻找可能遇到同样问题的其他花店用户。他们的项目页面很活跃,但看起来在过去的6年里它并没有那么活跃。由于那里的最新版本如此陈旧,您可能需要一个如此陈旧的编译器(和操作系统?)才能使用。哎呀。

好吧,这是一个很大的痛苦,但我发现了

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

最终的解决方案是:

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

-aI
提供库的ads文件的路径
-aO
提供了(在本例中)libflorit.so库文件的路径,最后(这是一个棘手的问题),您必须传递
-lflorist
来告诉它这是什么共享库……但传递它不会起作用。您必须在它前面放置一个
-largs
(对于编译和链接器),以便在编译阶段传递参数!没有它,这些阶段永远看不到争论

大家都来了!为了针对Linux(GCC)下的共享Ada库编译和链接代码,您需要提供库的头/规格、库位置和-llibname参数以及-larg,以便将它们传递到正确的位置


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

这是一个使用GNAT项目与Floriast一起构建的简单示例。我假设
$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;
with "florist";
project Id is
   for Main use ("id.adb");
   for Object_Dir use ".build_id";
   for Exec_Dir use ".";
end Id;
项目文件(
id.gpr
)与
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;
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

重新标记为蚊虫,因为这个问题完全是蚊虫特有的。嗨,是的……我真的开始害怕了。我无法理解为什么纯POSIX接口会是版本特定的。我要在两台不同的机器上试一下。我的直觉告诉我,这可能是编译器版本的问题,而不是内核+发行版的问题。因为我使用的编译器是4.4 GCC…也许我应该降级到4.1或4.2?我知道一些Linux的东西只适用于稍旧的4.xGCC编译器…我从这里开始。你到底需要Posix做什么?香草Ada本身几乎可以充当一个可移植层。它几乎有你们需要的一切。我需要一个设备的串行端口的直接控制,模拟调制解调器的AT命令集来控制一台大型机器。Ada可以做很多事情…但不能做串行端口:-)我以前在C中做过类似的事情,所以我不担心这是为什么它不能链接。Basic Termios.h stuff加上Ada绑定标准包含了将字符字节数据从TTY转换为POSIX字符串再转换为Ada字符串的例程,非常有效(而我正试图解决这个问题)。无论我使用的是蓝牙、串口、USB模拟串口等等,我都需要串口访问。就我个人而言,我很想直接进入操作系统。Ada与C库的绑定