2016-10-14 119 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符號)。

不幸的是,正如你所說的,這對靜態庫不起作用。