Ada中的导入实用程序:GNAT如何知道在哪里看?

问题描述 投票:0回答:1

我使用此编译指示从C导入getpid

function Get_Process_ID return Process_ID;
pragma Import (C, Get_Process_ID, "getpid");

我希望这会有点困难。要在C语言中使用getpid,我需要明确包含头文件unistd.h;。在上面的编译指示中,我没有引用头文件。 GNAT如何确切知道在哪里可以找到getpid

编辑:

这是一个最小的工作示例:

with Ada.Text_IO;

procedure Main is
   subtype Process_ID is Integer;
   function Get_Process_ID return Process_ID;
   pragma Import (C, Get_Process_ID, "getpid");   
begin
   Ada.Text_IO.Put_Line (Process_ID'Image (Get_Process_ID));
end Main;

另存为main.adb,将使用以下命令进行编译:

gnat make main.adb

我正在使用Ubuntu 18.04软件存储库中的gnat软件包的全新安装,没有配置文件或项目文件。 GNAT版本为7.5.0。

ada
1个回答
0
投票

详细说明可在GNAT Configurable Runtime Facility的AdaCore文档中找到。默认情况下,使用GNAT编译的程序与libc.a和其他一些链接:

构建Ada程序时,构成最终代码的目标代码可执行文件可能来自以下实体(除了用户代码本身):

  • GNAT Pro运行时库
  • C库
  • 数学库
  • 内部GCC库
  • 启动代码

GNAT和GCC驱动程序会自动链接所有这些库,具有最终可执行文件的对象(静态或动态)在目标和一些编译选项上。 -nostdlib-nodefaultlibs选项可用于控制此自动行为。

-nostdlib标志编译我的最小工作示例失败,并出现以下错误(以及其他错误):

...
main.adb:(.text+0x20): undefined reference to `getpid'
...

libc.a中提供的功能可能因平台而异。在Ubuntu上,您可以使用locate找到libc.a,并检查使用nm定义了哪些符号。

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