我使用此编译指示从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。
详细说明可在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
定义了哪些符号。