静态库的传递依赖与SCons

5 投票
2 回答
1252 浏览
提问于 2025-04-16 11:09

我在为两个库和它们的测试程序构建时,遇到了一个看似简单的问题。

问题是:我有两个静态库,分别叫libA和libB,而libB依赖于libA。我不想在使用libB的所有程序中都明确链接libA,我希望SCons能够自动识别,如果一个程序链接了libB,它也应该自动链接libA。

我做了一个简单的例子来说明这个问题。因为我找不到合适的文件托管服务,而且这是与编程相关的内容,所以我创建了一个小的SVN仓库:

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

或者你可以在这里下载一个压缩包。

2 个回答

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中所需的部分。

4

SCons本身不支持你所说的传递库依赖关系,但它的一个“年轻表亲”Waf可以做到这一点。你可以查看Waf书中的文档,了解它的“use”功能。Boost构建系统也有类似的功能,只是名字不同,具体可以参考这部分文档。如果你愿意写一点Python代码,也可以选择在SCons中自己实现这个功能。

你可以使用的一个技巧是定义回调函数作为构建变量(也就是通过Python函数调用来扩展的字符串)。让这个函数根据你在解析时计算的某种依赖关系图来计算所需的传递库列表(也就是通过在SConscripts中找到的方法调用),这样你就不需要为每个目标或环境重复列出完整的库列表了。

撰写回答