WAF - 组合静态库

Posted

技术标签:

【中文标题】WAF - 组合静态库【英文标题】:WAF - combine static libraries 【发布时间】:2016-04-25 12:04:50 【问题描述】:

我的项目具有外部库依赖项,我正在使用 waf 脚本来构建它 - C、C++。

我正在尝试构建静态库,它将静态链接所有依赖库。例如,我使用它来构建动态共享对象:

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)

【讨论】:

其实这样一来,静态库就会包含所有的递归依赖,因为它们是通过关键字使用指定的。如您所见, libs_list 两者都是相同的(如果我理解正确的话)。但是,外部库会出现问题 - 例如 libexpat.a。就我而言,libexpat 将使用 -Lexpat 链接到共享对象,但不适用于静态库。我希望 ar 包含所有这些外部库。 @mojo: 哼 使用 -v 查看发出了哪些命令。如果命令正常,您的问题可能是由于列表中静态库的顺序。 是的,我使用了 -v 但没有提到库,只有目标文件。这或许是意料之中的。问题是用 ar 将静态库合并为一个并不容易,默认情况下只使用目标文件。也许这就是为什么这根本不可能。我也不确定是否有一种很好的方法来获取所有依赖静态库的列表。我正在尝试手动运行 ar。为此,我需要所有依赖静态库的列表。目前,我正在解析上下文环境以获取所有以 STLIB_%s 开头的变量。我不认为这是最好的做事方式。 我不确定!? “使用”功能使用先前定义的库定义来工作。如果您在命令中没有看到任何库,则说明有问题... 你确定吗?我认为您不能在一个命令中将库依赖项添加到“ar”。 use 适用于“myshlib”,因为它使用 g++ 进行链接,但“mystlib”只是忽略了静态库。在这里你也可以看到,合并静态库并不是那么容易:***.com/questions/3821916/…

以上是关于WAF - 组合静态库的主要内容,如果未能解决你的问题,请参考以下文章

Win32编程之静态库编写与使用.动态链接库的编写与使用

使用 XCode 3 对 iPhone 静态库进行单元测试

动态链接库和静态链接库的区别

如何列出具有 .o 扩展名的静态库中的文件名

静态库与动态库注入

C语言里面的动态库和静态库