Ada对象声明"未签名未在系统中声明"

时间:2014-11-09 19:35:22

标签: ada

在我继承的一些代码中,我得到的编译错误“未签名”未在“系统”中声明。

我正在尝试使用GNAT编译它,但最终代码必须使用我无法访问的原始工具进行编译。所以我想了解如何在开发环境(包括项目文件)中解决这个问题,而不是修改现有代码。

我检查了文件system.ads,并且没有在那里定义Unsigned。我指的是错误的图书馆吗?如何通过上面提到的自我约束来解决这个问题(在原始环境中编译)?

2 个答案:

答案 0 :(得分:4)

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;

-- version for GNAT
with Interfaces.C;
package Foo is
    subtype Unsigned is Interfaces.C.Unsigned;
end Foo;

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

答案 1 :(得分:1)

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

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

在“源搜索路径”部分中类似地指示了RTS源。

使用子目录unsignedadainclude创建一个名为adalib的目录。

将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是您安装编译器的地方;它在您的系统上会有所不同,它位于安装bin和朋友的gnatls目录之上。

在此过程中会出现多个错误,所有错误都由use System.Unsigned_Types;单位引起(当我尝试时)。通过在package body

.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

在此阶段最好从.ali中删除所有.aunsigned/adalib文件并重复,以获得干净的构建。

现在,您应该能够使用{/ 1}}

System.Unsigned

就我而言,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;