2016-04-25 48 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