2016-10-14 85 views
1

我正在尝试使用gprbuild构建静态库。图书馆没有一个main(用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没有输出adainitadafinal。我试图链接它,并用objdump进行验证。

我试过各种开关的组合,但没有做粘结剂被调用,除非我改变为Library_Kinddynamic,并使用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-visible符号)。

不幸的是,正如你所说的,这对静态库不起作用。