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

问题描述 投票:2回答:2
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编译..没有工作。

gnu ada
2个回答
4
投票

除非有一些非常重要的原因,你必须坚持使用该文件命名约定,否则如果你采用默认的GNAT约定会更容易:spec文件名为.ads,body files .adb

事实上,当你说gnatmake xx.ada时,你得到的警告是文件名不符合预期,然后编译器继续;它看到xx.ada是一个包体,并去寻找规范(在xx.ads,因为你没有告诉它任何不同),并找不到它。

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

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");

或者,您可以通过编写项目文件来使用GNAT Project Manager中的等效文件,例如: t.gpr含有

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。)


0
投票

为了补充Simon Wright anwser,如果你能够编辑源文件,还需要一些额外的提示。

正如记载here

Pragma Source_File_Name

引用链接:

使用此选项可覆盖常规命名约定。它是一个配置编译指示,配置编译指示通常也适用(即它适用于整个分区,或编译中的所有单元,或适用于单个单元,具体取决于它的使用方式.bin_name被映射到file_name_literal。第二个参数的标识符是必需的,并指示这是规范的文件名还是正文的文件名。

Source_File_Name编译指示的另一种形式允许指定定义替代文件命名方案的模式以应用于所有文件。

 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编译指示控制,这些编译指示通常由项目经理自动提供。在Pragma Source_File_Name_Project之后,pragma Source_File_Name不会出现。

据我所知,这些似乎基本上是根据Simon的链接gnatname所做的,引用:

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

© www.soinside.com 2019 - 2024. All rights reserved.