Ada:Gnat生成坏的.o文件

Ada:Gnat生成坏的.o文件,ada,Ada,我的代码是: with Ada.Text_IO; use Ada.Text_IO; procedure Hello is begin Put_Line ("Hello, world!"); end Hello; GNAT产生一个.o和.ali 我打字 gcc hello.o -o hello GCC投诉: /usr/lib/gcc/i686-linux-gnu/6/../../../i386-linux-gnu/crt1.o: In function `_start': (.text+0

我的代码是:

with Ada.Text_IO; use Ada.Text_IO;
procedure Hello is
begin
  Put_Line ("Hello, world!");
end Hello;
GNAT产生一个
.o
.ali

我打字

gcc hello.o -o hello
GCC投诉:

/usr/lib/gcc/i686-linux-gnu/6/../../../i386-linux-gnu/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
hello.o: In function `_ada_hello':
hello.adb:(.text+0x26): undefined reference to `ada__text_io__put_line__2'
collect2: error: ld returned 1 exit status

您不应该尝试使用
gcc
命令手工编译Ada程序。根据您的喜好,有两种明智的选择:

  • 按照Brian在评论中的建议,使用
    gnatmake
    命令。只要所有相关的源文件都存储在同一目录中,这种方法就可以正常工作
  • 创建项目文件并使用
    gprbuild
    。项目可以处理分布在多个目录中的源文件,包括其他项目,包含编译器和链接器标志等
  • 在“Hello_World”级别上,
    gnatmake
    可以正常工作,但是您应该注意,
    gnatmake
    的行为与真正的Ada编译器不同,除非您向它传递一些特定的标志。我在shell中使用了一个别名来处理这个问题,但事实上,这是支持使用
    gprbuild
    的另一个论点,即使对于很小的项目也是如此,因为您可以在项目文件中放置使GCC表现得像真正的Ada编译器的标志,而不必担心它

    project Hello_World is
       for Source_Dirs use ("src");
       for Object_Dir  use "obj";
       for Exec_Dir    use "bin";
    
       for Main use ("hello.adb");
    
       package Builder is
          for Default_Switches ("Ada")
            use ("-m");
       end Builder;
    
       package Compiler is
          for Default_Switches ("Ada")
            use ("-fstack-check", --  Generate stack checking code (part of Ada)
                 "-gnata",        --  Enable assertions            (part of Ada)
                 "-gnato13",      --  Overflow checking            (part of Ada)
                 "-gnatf",                      --  Full, verbose error messages
                 "-gnatwa",                     --  All optional warnings
                 "-gnatVa",                     --  All validity checks
                 "-gnaty3abcdefhiklmnoOprstux", --  Style checks
                 "-gnatwe",                     --  Treat warnings as errors
                 "-gnat2012",                   --  Use Ada 2012
                 "-Wall",                       --  All GCC warnings
                 "-O2");                        --  Optimise (level 2/3)
       end Compiler;
    end Hello_World;
    

    如果使用GNAT Programming Studio(GPS)作为IDE,您可能需要删除
    -gnatf
    标志,正如我所经历的那样,这可能会阻止GPS解析来自编译器的错误消息。

    只需使用
    gnatmake hello.adb
    。或者花大量时间学习如何手动绑定和链接到Ada运行时系统(RTS)。虽然tho.o文件没有问题,但它链接到RTS,RTS提供诸如Ada.Text\u IO.Put\u line之类的缺失位。让Gnatmake(或gprbuild)为您处理这些细节。如果目标只是让GNAT“表现得像一个真正的Ada编译器”(我真的认为这不是我们应该向新手传达的信息),那么这就太过分了。使用最新的编译器(自2016年起),您不需要
    -gnato
    ,而
    -gnat2012
    是默认编译器(自2015年起)。我不使用IDE。我不是新手。我在新的ubuntu 17.10安装中使用了ada。我不工作