在 Ada 中导入编译指示:GNAT 如何知道去哪里找?

cas*_*avo 3 ada

我使用这个 pragmagetpid从 C导入:

function Get_Process_ID return Process_ID;
pragma Import (C, Get_Process_ID, "getpid");
Run Code Online (Sandbox Code Playgroud)

我预计这会更难一些。要getpid在 C 中使用,我需要明确包含头文件 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;
Run Code Online (Sandbox Code Playgroud)

保存为 main.adb,使用以下命令编译:

gnat make main.adb
Run Code Online (Sandbox Code Playgroud)

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

cas*_*avo 6

AdaCore 关于GNAT 可配置运行时工具的文档中提供了详细说明。默认情况下,使用 GNAT 编译的程序与 libc.a 和其他一些程序链接:

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

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

GNAT 和 GCC 驱动程序自动将所有这些库和对象与最终可执行文件静态或动态链接,具体取决于目标和某些编译选项。在-nostdlib-nodefaultlibs选项可以被用来控制该自动行为。

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

...
main.adb:(.text+0x20): undefined reference to `getpid'
...
Run Code Online (Sandbox Code Playgroud)

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