【问题标题】:Transitive dependencies for static libraries and SCons静态库和 SCons 的传递依赖
【发布时间】:2011-06-20 17:43:41
【问题描述】:

我在构建两个库并为两者测试程序时偶然发现了一个看似简单的问题。

问题:我有两个静态库,libA 和 libB,而 libB 依赖于 libA。我不想将所有使用 libB 的程序显式链接到 libA,我希望 SCons 看到如果程序链接到库 B,它也应该链接到库 A。

我已经建立了一个简单的例子来说明这个问题。由于我找不到合适的文件托管程序并且这与编程相关,我创建了一个小型 SVN 存储库:

svn checkout https://example-repository.googlecode.com/svn/trunk example-repository

或者你可以下载一个压缩包here

【问题讨论】:

    标签: python c dependencies scons


    【解决方案1】:

    SCons 没有内置对表达传递库依赖项的支持,如您所描述的,但它的表弟 Waf 有。有关 Waf 书中的“使用”功能,请参阅 documentationBoost build system 也有这个功能under a different name。如果您愿意编写一点 Python 代码,也可以选择自己在 SCons 中实现。

    您可以使用的一个技巧是将回调定义为构造变量(即,将通过 Python 函数调用扩展的字符串)。让该函数调用根据您在解析时计算的某种形式的依赖关系图(即通过在 SConscripts 中找到的方法调用)计算您需要的库的传递列表,并且您不必为每个目标重复库的完整列表或环境。

    【讨论】:

    • +1 个有趣的链接!我会查看 waf 手册,但据我所知,这可能是一个不错的选择。另一方面,我已经开始使用 SCons 实现一些自定义构建器...
    • 我当前的解决方案基于包含依赖信息的额外配置文件构建依赖关系图,因为我发现没有其他方法可以动态获取构建目标之间的依赖关系。
    【解决方案2】:

    什么是 libB 和 libA?它们是一个大的 .o 库还是由多个 .o 文件组成的?

    如果库是多个 .o 文件,并且您在使用 libA 的 .o 文件之一的 libB 的 .o 文件之一中调用函数,那么您将获得 libB 的 .o 和依赖的 libA .o。如果您在 libB .o 中使用不依赖于任何来自 libA 的函数,那么您只能在二进制文件中获取 libB .o 文件。

    因此,如果你有命令:

    cc -o a.out a.c libA.a libB.a
    

    您只能从 libB 和 libA 中获得所需的部分。

    【讨论】:

    • 它们只包含简单的目标文件,如示例 tarball 中所示(请参阅帖子末尾的链接)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 2017-05-02
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多