在我继承的一些代码中,我得到的编译错误“未签名”未在“系统”中声明。
我正在尝试使用GNAT编译它,但最终代码必须使用我无法访问的原始工具进行编译。所以我想了解如何在开发环境(包括项目文件)中解决这个问题,而不是修改现有代码。
我检查了文件system.ads,并且没有在那里定义Unsigned。我指的是错误的图书馆吗?如何通过上面提到的自我约束来解决这个问题(在原始环境中编译)?
答案 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源。
使用子目录unsigned
,adainclude
创建一个名为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
中删除所有.a
和unsigned/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;