2011-02-03 37 views
5

我在为两者构建两个库和测试程序时偶然发现了一个看似简单的问题。静态库和SCons的传递依赖关系

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

我已经建立了一个简单的例子来说明这个问题。因为我无法找到合适的文件托管服务提供商并这是编程有关,我创建了一个小型SVN仓库:

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

,或者你可以下载一个压缩文件here

回答

4

SCons并不支持表达传递库依赖关系,但它的年轻表弟Waf确实如此。 Waf书中的“使用”功能见documentationBoost build system也有这个功能under a different name。如果你愿意编码一点Python,你也可以选择在SCons中自己实现它。

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

+0

+1有趣的链接!我会检查一下waf手册,但从我看到的情况来看,这可能是一个不错的选择。另一方面,我已经开始使用SCons实现一些自定义构建器... – hochl 2011-02-11 09:35:42

0

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

如果libs是多个.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和利巴所需要的零件。

+0

它们只包含简单的对象文件,可以在示例tarball中看到(请参阅发布结束时的链接)。 – hochl 2011-02-03 17:26:09