首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用gnatmake编译规范_.ada和body .ada?

如何使用gnatmake编译规范_.ada和body .ada?
EN

Stack Overflow用户
提问于 2019-03-12 08:02:53
回答 2查看 531关注 0票数 3
代码语言:javascript
复制
gnatmake xx.ada xx_.ada     
gcc -c -x ada xx.ada      
xx.ada:44:14: warning: file name does not match unit name, should be 
"xx.adb"  
xx.ada:44:14: file "xx.ads" not found
gnatmake: "xx.ada" compilation error

尝试使用gnatmake..its编译不起作用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-12 09:03:46

除非有一些非常重要的原因必须坚持该文件命名约定,否则,如果使用默认的小虫约定:规范文件名为.ads,body文件.adb,则会容易得多。

实际上,当您说gnatmake xx.ada时,您会得到这样的警告:文件名不像预期的那样,然后编译器继续;它看到xx.ada是一个包体,然后查找规范(在xx.ads中,因为您没有告诉它任何不同),并且找不到它。

有一个实用程序gnatname (请参阅这里),您可以在源代码上运行它(gnatname *.ada为我工作,只有4个文件)来生成一个“配置文件”gnat.adc,这个gnat.adc首先读取,然后明确告诉它哪个文件包含什么内容。我的测试结果是

代码语言:javascript
复制
pragma Source_File_Name
  (Linked_List,
   Body_File_Name => "linked_list.ada");
pragma Source_File_Name
  (Lists,
   Spec_File_Name => "lists_.ada");
pragma Source_File_Name
  (Lists,
   Body_File_Name => "lists.ada");
pragma Source_File_Name
  (Linked_List,
   Spec_File_Name => "linked_list_.ada");

或者,您可以通过编写一个项目文件(例如包含以下内容的蚊虫项目经理 )来使用t.gpr中的等价物

代码语言:javascript
复制
project T is

   package Naming is
      for Spec_Suffix ("ada") use "_.ada";
      for Body_Suffix ("ada") use ".ada";
   end Naming;

end T;

并使用gnatmake -P t.gpr进行编译。

(较新的GNAT版本包括一个实用程序gprbuild,它可以理解.gpr文件;如果它找到了,那么gnatmake实际上将调用gprbuild,所以您实际上要说的是gprbuild -P t.gpr。)

票数 4
EN

Stack Overflow用户

发布于 2019-03-14 01:30:34

为了补充西蒙赖特,如果你能编辑源文件,一些额外的提示。

如文件所示的这里

代码语言:javascript
复制
Pragma Source_File_Name

引用链接:

使用此选项可以重写正常的命名约定。它是一个配置杂注,配置杂注的通常适用性也是如此(也就是说,它适用于整个分区,或编译中的所有单元,或单个单元,具体取决于它的使用方式)。unit_name映射到file_name_literal。第二个参数的标识符是必需的,并指示这是规范的文件名还是主体的文件名。

另一种形式的Source_File_Name实用程序允许定义替代文件命名方案的模式规范应用于所有文件。

代码语言:javascript
复制
 pragma Source_File_Name
   (  [Spec_File_Name  =>] STRING_LITERAL
    [,[Casing          =>] CASING_SPEC]
    [,[Dot_Replacement =>] STRING_LITERAL]);

 pragma Source_File_Name
   (  [Body_File_Name  =>] STRING_LITERAL
    [,[Casing          =>] CASING_SPEC]
    [,[Dot_Replacement =>] STRING_LITERAL]);

 pragma Source_File_Name
   (  [Subunit_File_Name =>] STRING_LITERAL
    [,[Casing            =>] CASING_SPEC]
    [,[Dot_Replacement   =>] STRING_LITERAL]);

 CASING_SPEC ::= Lowercase | Uppercase | Mixedcase

第一个参数是包含一个星号的模式,该星号指示要在模式字符串中插入单元名称以形成文件名的点。第二个参数是可选的。如果存在,则在生成的文件名字符串中指定单元名称的大小写。默认情况是小写。最后,第三个参数允许系统地用指定的字符串文字替换单元名称中的任何点。

并警告:

注意,如果您正在使用项目文件,则不应该使用Source_File_Name实用程序。这个规则的原因是项目经理不知道这些实用程序,因此使用projet文件的其他工具将不知道预期的命名约定。如果使用的是项目文件,则文件命名由项目经理自动提供的Source_File_Name_Project实用程序控制。语用Source_File_Name不能出现在pragma Source_File_Name_Project之后。

据我所知,根据西蒙的链接,这些似乎是小虫子的名字,引用如下:

为了帮助维护编译器中编译单元名和源文件名之间的对应关系,GNAT提供了一个工具来为一组生成所需的标记。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55116658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档