“Ada对象声明”;“未在系统中声明未签名”;

“Ada对象声明”;“未在系统中声明未签名”;,ada,Ada,在我继承的一些代码中,我得到编译错误“Unsigned”未在“System”中声明 我试图使用GNAT编译此代码,但最终代码必须使用原始工具进行编译,我没有现成的访问权限。因此,我想了解如何从开发环境(包括项目文件)中解决这个问题,而不是修改现有代码 我检查了file system.ads,其中没有定义Unsigned。我指的是错误的图书馆吗?我如何使用上面提到的自我约束解决这个问题(在原始环境中编译)?unsigned是C中预定义类型的名称。如果您需要一个与C类型匹配的Ada类型,那么您需要的

在我继承的一些代码中,我得到编译错误“Unsigned”未在“System”中声明

我试图使用GNAT编译此代码,但最终代码必须使用原始工具进行编译,我没有现成的访问权限。因此,我想了解如何从开发环境(包括项目文件)中解决这个问题,而不是修改现有代码


我检查了file system.ads,其中没有定义Unsigned。我指的是错误的图书馆吗?我如何使用上面提到的自我约束解决这个问题(在原始环境中编译)?

unsigned
是C中预定义类型的名称。如果您需要一个与C类型匹配的Ada类型,那么您需要的是
Interfaces.C.unsigned
。一个旧的Ada实现(在1995年标准引入Interfaces.C之前)可能已经为此定义了
System.Unsigned

这将有助于了解代码最初是为什么编写的Ada实现

您应该检查代码,看看它是否使用该类型来连接C代码。如果不是(也就是说,如果它只是用作一般的无符号整数类型),那么你可以考虑定义自己的模块类型。 如果我理解正确,您需要在原始环境和GNAT中编译代码。这可能很困难。一种方法是定义一个包含两个不同版本的新包,一个用于原始环境,一个用于GNAT(或者,理想情况下,用于任何现代Ada实现)。例如:

-- version for original environment
with System;
package Foo is
    subtype Unsigned is System.Unsigned;
end foo;
以及:


选择一个比
Foo
更好的名称作为练习,自动确定要使用的版本。

unsigned
是C中预定义类型的名称。如果需要与C类型匹配的Ada类型,则需要
Interfaces.C.unsigned
。一个旧的Ada实现(在1995年标准引入Interfaces.C之前)可能已经为此定义了
System.Unsigned

这将有助于了解代码最初是为什么编写的Ada实现

您应该检查代码,看看它是否使用该类型来连接C代码。如果不是(也就是说,如果它只是用作一般的无符号整数类型),那么你可以考虑定义自己的模块类型。 如果我理解正确,您需要在原始环境和GNAT中编译代码。这可能很困难。一种方法是定义一个包含两个不同版本的新包,一个用于原始环境,一个用于GNAT(或者,理想情况下,用于任何现代Ada实现)。例如:

-- version for original environment
with System;
package Foo is
    subtype Unsigned is System.Unsigned;
end foo;
以及:


选择一个比
Foo更好的名称作为练习,自动确定使用哪个版本。

您可以使用稍微修改的
system.ads
重建GNAT运行时系统(RTS)

在系统RTS中有一个
Makefile.adalib
(好吧,GNAT GPL 2014中也有),它允许您这样做。它位于
gnatls-v
输出的“对象搜索路径”部分中指示的最后一个目录

RTS源在“源搜索路径”部分中也有类似的指示

创建一个带有子目录
adainclude
adalib
的目录,比如
unsigned

将RTS源复制到
unsigned/adainclude
,然后编辑
system.ads
以包括

type Unsigned is mod 2 ** 32;
(我猜一点,但这可能是你想要的!)

然后,在
unsigned/adalib

make -f Makefile.adalib ADA_INCLUDE_PATH=../adainclude ROOT=/opt/gnat-gpl-2014
ROOT
是安装编译器的地方;它在您的系统上会有所不同,它位于安装了
gnatls
和friends的
bin
目录之上)

在此过程中会出现几个错误,都是由
使用System.Unsigned_类型的单元引起的(当我尝试时)。通过在
.adb
中的
包体之后立即插入此代码来解决此问题:

subtype Unsigned is System.Unsigned_Types.Unsigned;
我必须更改的文件是

s-expmod.adb
s-expuns.adb
s-imgbiu.adb
s-imgrea.adb
s-imguns.adb
s-imgwiu.adb
s-valint.adb
s-valuns.adb
s-vercon.adb
在此阶段,最好从
unsigned/adalib
中删除所有
.ali
.a
文件,然后重复,以获得一个干净的构建

现在,您应该能够使用
System.Unsigned
by

gnatmake --RTS=/location/of/unsigned t.adb
在我的例子中,
t.adb
包含

with System;
with Ada.Text_IO; use Ada.Text_IO;
procedure T is
begin
   Put_Line ("first: " & System.Unsigned'First'Img);
   Put_Line ("last:  " & System.Unsigned'Last'Img);
   Put_Line ("42:    " & System.Unsigned'Value ("42")'Img);
   Put_Line ("16#42#:" & System.Unsigned'Value ("16#42#")'Img);
end T;
结果是

$ ./t
first:  0
last:   4294967295
42:     42
16#42#: 66

您可以使用稍微修改的
system.ads
重新构建GNAT运行时系统(RTS)

在系统RTS中有一个
Makefile.adalib
(好吧,GNAT GPL 2014中也有),它允许您这样做。它位于
gnatls-v
输出的“对象搜索路径”部分中指示的最后一个目录

RTS源在“源搜索路径”部分中也有类似的指示

创建一个带有子目录
adainclude
adalib
的目录,比如
unsigned

将RTS源复制到
unsigned/adainclude
,然后编辑
system.ads
以包括

type Unsigned is mod 2 ** 32;
(我猜一点,但这可能是你想要的!)

然后,在
unsigned/adalib

make -f Makefile.adalib ADA_INCLUDE_PATH=../adainclude ROOT=/opt/gnat-gpl-2014
ROOT
是安装编译器的地方;它在您的系统上会有所不同,它位于安装了
gnatls
和friends的
bin
目录之上)

在此过程中会出现几个错误,都是由
使用System.Unsigned_类型的单元引起的(当我尝试时)。通过在
.adb
中的
包体之后立即插入此代码来解决此问题:

subtype Unsigned is System.Unsigned_Types.Unsigned;
我必须更改的文件是

s-expmod.adb
s-expuns.adb
s-imgbiu.adb
s-imgrea.adb
s-imguns.adb
s-imgwiu.adb
s-valint.adb
s-valuns.adb
s-vercon.adb
在此阶段,最好从
unsigned/adalib
中删除所有
.ali
.a
文件,然后重复,以获得一个干净的构建

现在,您应该能够使用
System.Unsigned
by

gnatmake --RTS=/location/of/unsigned t.adb
在我的cas中