Ada 库 initialisation/elaboration 和 GPR 指令:找不到详细说明符号

Ada library initialisation/elaboration and GPR directives : can't find elaboration symbol

我正在尝试为 iOS 生成一个 Ada 库。 但是需要手动进行Ada细化。

我知道编译器可以生成一个初始化符号,以后可以导入和使用。但是,对于以下 GPR 定义,它不会产生(nm 命令不会列出它)。命名应该是 <libname>init<libname> 对应于 GPR 指令中定义的值 Library_Name

GPR 按以下方式定义(这个是 windows/style - 请参阅 DLL 参考 -,但在 Mac 上为 iOS 生成时也会出现问题:

project adalib is
    for Languages use ("Ada");
    for Source_Dirs use (project'Project_Dir & "./src");
    for Library_Kind use "static"; --"static" on iOS will produce a .a file
    for Library_Name use project'Name; -- will produce "libadalib.a"
    for Library_Dir use project'Project_Dir & "./lib";
    for Library_Src_Dir use project'Project_Dir & "./includes";
    -- define your favorite compiler, builder, binder, linker options
end adalib;

我想念它:如何生成该符号?

我找到了解决办法。 我的 GPR 缺少这个简单的指令:

    for Library_Interface use ("mypackage"); -- put whatever packages you want to expose, without .adb/.ads since we're talking about packages

使用上面的指令,我可以通过 nm 命令找到 adalibinit 符号。 当我在我的ada代码中导入它时,我也可以使用它,参见:

package body mypackage is
    procedure Init_My_Lib
    is
       -- I want to call elaboration;
       pragma import (C, ada_elaboration, "adalibinit");
    begin
       ada_elaboration;
       -- further code
    end Init_My_Lib;
-- rest of package

所以,完整的 GPR 应该是:

project adalib is
    for Languages use ("Ada");
    for Source_Dirs use (project'Project_Dir & "./src");
    for Library_Kind use "static"; -- will produce a .a file
    for Library_Name use project'Name; -- will produce "libadalib.a"

    for Library_Interface use ("mypackage"); -- <=== THIS IS HERE

    for Library_Dir use project'Project_Dir & "./lib";
    for Library_Src_Dir use project'Project_Dir & "./includes";
    -- define your favorite compiler, builder, binder, linker options
end adalib;