2016-04-25 81 views
2

我的項目有外部庫依賴關係,我正在使用waf腳本來構建它 - C,C++。WAF - 結合靜態庫

我想建立一個靜態庫,它將靜態鏈接所有相關庫。例如,我使用它來建立動態共享對象:

bld.program(features = 'c cxx cxxshlib' 
      , target = 'program' 
      , source = sources 
      , use = libs_list) 

共享對象將具有所有鏈接的依賴庫(具有libs_list指定)。 但是,靜態庫:

bld.program(features = 'c cxx cxxstlib' 
      , target = 'program' 
      , cppflags = '-DSTATIC_LIB' 
      , source = sources 
      , use = libs_list) 

不會。有沒有辦法解決這個問題?或者我需要在後期構建函數中手動執行此操作?

回答

1

在waf 1.8之前,靜態庫用於與共享對象共享遞歸依賴關係的相同行爲。由於靜態庫的使用順序,我認爲這已被刪除。這意味着如果您的共享對象依賴於其他庫,waf將自動包含它們,但對於靜態庫,您必須按照正確的順序列出所有庫。

這裏是如何「uselib」應使用:

def configure(conf): 

    # for libs that have a pkg-config 

    conf.check_cfg("expat", args = ["--libs"]) 

    # to use /some/path/libotherextlib.a or .so 

    conf.env.LIB_OEL = ['otherextlib'] 
    conf.env.LIBPATH_OEL = ["/some/path"] 

def build(bld): 

    lib_lists = ["expat", "oel"] 

    bld.shlib(target = 'myshlib', source = sources, use = libs_list) 
    bld.stlib(target = 'mystlib', source = sources, use = libs_list) 

模塊化,你可以這樣做:

bld.objects(source = sources1, name = "module1") 
bld.objects(source = sources2, name = "module2") 

modules = ["module1", "module2"] 
bld.stlib(target = 'mystlib', use = modules) 
bld.shlib(target = 'myshlib', use = modules) 
+0

其實,這樣一來,靜態庫將包含所有遞歸的依賴,因爲這些都是由關鍵字use指定。正如你所看到的,兩個libs_list是相同的(如果我正確理解你的話)。 但是,問題發生在外部庫 - 例如libexpat.a。在我的情況下,libexpat將通過-Lexpat鏈接到共享對象,但不能用於靜態庫。 我想要包括所有這些外部庫。 – Mojo28

+0

@mojo:使用-v來查看發出了哪些命令。如果該命令正常,則可能是由於列表中靜態庫的順序。 – neuro

+0

是的,我用-v但沒有提到libs,只有對象文件。這也許是預料之中的。問題是用ar來合併靜態庫並不容易,默認情況下只使用對象文件。也許這就是爲什麼這是不可能的。我也不確定是否有一個很好的方法來獲取所有依賴靜態庫的列表。我試圖手動運行ar。爲此,我需要所有依賴靜態庫的列表。目前,我正在解析上下文環境以獲取以STLIB_%s開頭的所有變量。我不認爲這是做事最好的方式。 – Mojo28