静态库和SCons的传递依赖关系

5
我在为两个库和测试程序构建时遇到了一个看似简单的问题。
问题是:我有两个静态库,libA和libB,而libB依赖于libA。我不想显式地将所有使用libB的程序都链接到libA,我希望SCons能够看到,如果一个程序链接到库B,它也应该链接到库A。
我建立了一个简单的示例来说明这个问题。由于我找不到合适的文件托管者,而且这与编程有关,因此我创建了一个小型的SVN存储库。
svn checkout https://example-repository.googlecode.com/svn/trunk example-repository

或者您可以从这里下载一个tarball压缩文件。
2个回答

4
SCons没有内置支持表达传递库依赖关系的功能,但它的年轻表弟Waf有这个功能。请参阅Waf手册中“use”功能的文档Boost build system也具有此功能,只是名称不同。如果您愿意编写一些Python代码,也可以选择在SCons中自行实现此功能。
您可以使用定义回调作为构建变量的能力(即通过Python函数调用扩展的字符串)。让该函数调用根据某种形式的依赖图(即通过在SConscripts中找到的方法调用)计算出所需的传递库列表,并且您将不必为每个目标或环境重复完整的库列表。

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

0
libB和libA是什么?它们是一个大的.o文件还是由多个.o文件组成?
如果这些库是多个.o文件,并且您正在调用libB的一个.o文件中使用了libA的一个.o文件的函数,则会获取libB的.o文件和依赖的libA .o文件。如果您在libB .o中使用不依赖于libA的任何内容的函数,则只会在二进制文件中获取libB .o文件。
因此,如果您有以下命令:
cc -o a.out a.c libA.a libB.a

你只会从libB和libA中获取所需的部分。


它们只包含简单的目标文件,如示例tarball中所示(请参见帖子末尾的链接)。 - hochl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接