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程序。根据您的喜好,有两种明智的选择:
gnatmake
命令。只要所有相关的源文件都存储在同一目录中,这种方法就可以正常工作gprbuild
。项目可以处理分布在多个目录中的源文件,包括其他项目,包含编译器和链接器标志等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。我不工作