如何编译这个程序? 链接器阶段错误

我在Windows 10上安装了gnat gpl 2016,并尝试用gnatmake编译下面的(小)程序。 问题是由于从libc中导入了一个函数,这个任务似乎比简单的gnatmake.exe gsh_repl.adb复杂得多[gnatmake会在linux上编译这个就好 – 在最糟糕的情况下添加-lglibc就足够了]。 我的问题是,我不知道我应该添加哪个选项,使链接阶段完成成功。 这里是程序:

with Ada.Text_IO; with System; procedure GSH_Repl is function System (Command : in String) return Integer is Actual_Cmd : aliased constant String := Command & Character'Val (0); -- append nul to string function System_C (Command : in Standard.System.Address) return Integer with Import => True, External_Name => "system", Convention => StdCall; begin return System_C (Actual_Cmd'Address); end System; begin loop declare File : Ada.Text_Io.File_Type; Line : constant String := Ada.Text_IO.Get_Line; Status : Integer := 0; begin if Line = "exit" then exit; end if; Ada.Text_Io.Open (File, Ada.Text_Io.Out_File, "script"); Ada.Text_IO.Put_Line (File, Line); Ada.Text_Io.Close (File); Status := System ("c:\repos\gsh\obj\dev\gsh.exe script"); Ada.Text_Io.Put_Line ("$? = " & Integer'Image (Status)); end; end loop; end GSH_Repl; 

程序中可能存在某种错误 – 但编译好并且在链接器阶段失败:

 >gnatmake.exe -L"c:\Programs\GNAT_2016\bin" -llibglibc-2.0-0.dll gsh_repl.adb gnatmake.exe -L"c:\Programs\GNAT_2016\bin" -llibglibc-2.0-0.dll gsh_repl.adb gnatbind -x gsh_repl.ali gnatlink gsh_repl.ali -Lc:\Programs\GNAT_2016\bin .\gsh_repl.o:gsh_repl.adb:(.text+0x1cc): undefined reference to `system@4' collect2.exe: error: ld returned 1 exit status gnatlink: error when calling C:\Programs\GNAT_2016\bin\gcc.exe gnatmake: *** link failed. 

Stdcall是win32 API使用的惯例。 当你用GNAT编译你的代码时,libc是GCC的libc,因此它使用C约定来处理所有事情。

将System_C绑定更改为以下内容:

 function System_C (Command : in Standard.System.Address) return Integer with Import => True, External_Name => "system", Convention => C; 

将解决您的问题。