gpt4 book ai didi

ada - 在 Ada 中导入编译指示 : How does GNAT know where to look?

转载 作者:行者123 更新时间:2023-12-04 00:57:35 25 4
gpt4 key购买 nike

我使用这个编译指示从 C: 导入 getpid

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

我预计这会更难一些。要在 C 中使用 getpid,我需要明确包含头文件 unistd.h;在上面的 pragma 中,我没有引用头文件。 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。

最佳答案

AdaCore 的文档中有详细的解释 GNAT Configurable Runtime Facility .默认情况下,使用 GNAT 编译的程序链接到 libc.a 和其他几个:

When an Ada program is built, the object code that makes up the final executable may come from the following entities (in addition to the user code itself):

  • GNAT Pro run-time library
  • C library
  • Math library
  • Internal GCC library
  • Startup code

The GNAT and GCC drivers automatically link all these libraries and objects with the final executable, statically or dynamically depending on the target and on some compilation options. The -nostdlib and -nodefaultlibs options may be used to control this automatic behavior.

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

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

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

关于ada - 在 Ada 中导入编译指示 : How does GNAT know where to look?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61178941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com