2016-10-14 6 views
1

Я пытаюсь построить статическую библиотеку, используя gprbuild. В библиотеке нет основной (которая написана на C и связана на более позднем этапе) и должна быть автономной, насколько я понимаю, термин gpr для этого является «автономным», что означает, что не требуется связывать с чем-либо, включая время выполнения во время выполнения.Построение статической автономной библиотеки с gprbuild

Мой GPR выглядит следующим образом

project Ada_Foo_Lib is 

    for Source_Dirs use ("src"); 
    for Object_Dir use "obj"; 
    for Library_Dir use "lib"; 
    for Library_Name use "ada_foo_lib"; 
    for Library_Kind use "static"; 

    package Binder is 
     for Default_Switches("Ada") use ("-n"); 
     for Required_Switches ("Ada") use ("-n"); 
    end Binder; 

end Ada_Foo_Lib; 

Когда я бегу gprbuild, я вижу в журнале, который не включает в себя вызов вяжущего:

gnatmake -Pada_foo_lib.gpr --create-missing-dirs 
gcc-4.9 -c -I- -gnatA /home/temp/src/ada_foo_pack.adb 

building static library for project ada_foo_lib 
ar cr /home/temp/lib/libada_foo_lib.a /home/temp/obj/ada_foo_pack.o 
ranlib /home/temp/lib/libada_foo_lib.a 

Моя проблема в том, что в результате libada_foo_lib.a не имеет adainit и adafinal экспорт. Я попытался связать его, а также проверить с помощью objdump.

Я перепробовал все виды комбинаций переключателей, но ничего не сделал вяжущего называть, если я не изменил в Library_Kind на dynamic и использовать Library_Standalone:

+0

Можно ли добавить заглушку «main», чтобы заставить «adainit» и «adafinal» быть связанными, но не называть их? –

ответ

1

Если ваша библиотека не должна быть статичной, но только быть самодостаточным (т.е. включить необходимые части выполнения Ада внутри себя), можно сказать, что

for Library_Kind use "dynamic"; 
for Library_Interface use ("One_Of_Your_Units"); 
for Library_Standalone use "encapsulated"; 

(вы должны иметь Library_Interface, но я не думаю, что он должен включать в себя все блоки которые экспортируют C-видимые символы).

К сожалению, как вы отметили, это не работает для статических библиотек.