2017-06-28 3 views
0

J'essaie de créer une bibliothèque Ada pour iOS. Cependant, il est nécessaire d'effectuer l'élaboration Ada manuellement.Directives d'initialisation/élaboration de la bibliothèque Ada et GPR: impossible de trouver le symbole d'élaboration

Je sais que le compilateur peut produire un symbole init, qui peut être importé et utilisé plus tard. Cependant, avec la définition GPR suivante, elle n'est pas produite (la commande nm ne la liste pas). La dénomination est censé être <libname>init avec <libname> correspondant à la valeur définie dans la directive GPR Library_Name

Le GPR est défini de la façon suivante (celui-ci est de style Windows/-voir DLL, mais les mentions-problèmes applique également lorsque produisant pour iOS sur un Mac):

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; 

Il me manque: comment produire ce symbole?

Répondre

1

J'ai trouvé la solution. Mon GPR manquait cette simple directive:

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

Avec la directive ci-dessus, je peux trouver le symbole adalibinit via la commande nm. Lorsque je l'importer dans mon code ada, je peux aussi l'utiliser, voir:

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 

Ainsi, la pleine GPR devrait être:

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; 
+0

Il serait habituel pour 'Library_Src_Dir' être différent de 'Library_Dir' "" ./include "'. Mais si ça marche ..! –

+0

Je vais éditer cela bientôt – LoneWanderer

+0

Ok, maintenant il est corrigé – LoneWanderer