2016-04-25 5 views
2

Mein Projekt hat externe Bibliothek Abhängigkeiten und ich benutze Waf-Skripte, um es zu bauen - C, C++.WAF - kombinieren Sie statische Bibliotheken

Ich versuche, statische Bibliothek zu erstellen, die alle abhängigen Bibliotheken statisch verknüpft haben wird. Zum Beispiel verwende ich diese dynamische gemeinsame Objekt zu bauen:

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

Gemeinschafts-Objekt alle abhängigen Bibliotheken haben (angegeben mit libs_list) verknüpft. jedoch statische Bibliothek:

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

nicht. Gibt es einen Weg, dies zu überwinden? Oder muss ich das manuell in der Post-Build-Funktion tun?

Antwort

1

Vor Version 1.8 haben die statischen Bibliotheken das gleiche Verhalten rekursiver Abhängigkeiten mit gemeinsamen Objekten. Aufgrund der statischen libs Reihenfolge der Verwendung, ich denke, das wurde entfernt. Das bedeutet, wenn Ihr gemeinsames Objekt von anderen Bibliotheken abhängig ist, wird waf sie automatisch mit einschließen, aber für statische Bibliotheken müssen Sie alle Bibliotheken selbst in der richtigen Reihenfolge auflisten.

Hier ist, wie ‚USELIB‘ verwendet werden soll:

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) 

Sie tun können, modularisieren:

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

Eigentlich diese Weise statische lib werden alle rekursiven Abhängigkeiten enthalten, denn das sind spezifiziert durch Schlüsselwortgebrauch. Wie Sie sehen können, ist libs_list für beide gleich (wenn ich Sie richtig verstanden habe). Das Problem tritt jedoch bei den Bibliotheken auf, die extern sind - libexpat.a zum Beispiel. In meinem Fall wird libexpat mit einem gemeinsamen Objekt mit -Lexpat verknüpft, aber nicht mit einer statischen lib. Ich möchte, dass alle diese externen Bibliotheken enthalten. – Mojo28

+0

@mojo: hum Verwenden Sie -v, um zu sehen, welche Befehle ausgegeben werden. Wenn der Befehl in Ordnung ist, liegt Ihr Problem wahrscheinlich an der Reihenfolge der statischen Bibliotheken in der Liste. – neuro

+0

Ja, ich habe -v verwendet, aber keine Bibliotheken werden erwähnt, nur Objektdateien. Dies wird vielleicht erwartet. Das Problem ist, dass es nicht so einfach ist, statische Bibliotheken in eine mit ar zusammenzufassen, sondern standardmäßig nur Objektdateien. Vielleicht ist das deshalb nicht möglich. Ich bin mir auch nicht sicher, ob es eine nette Möglichkeit gibt, eine Liste aller abhängigen statischen Bibliotheken zu erhalten. Ich versuche, ar manuell auszuführen. Dazu benötige ich eine Liste aller abhängigen statischen Bibliotheken. Momentan analysiere ich Kontext-env, um alle Variablen zu erhalten, die mit STLIB_% s beginnen. Ich denke nicht, dass das die schönste Art ist, Sachen zu machen. – Mojo28