静态库和 SCons 的传递依赖项

发布于 2024-10-16 00:42:51 字数 501 浏览 5 评论 0原文

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

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

我构建了一个简单的示例来说明这个问题。由于我找不到合适的文件托管服务并且这与编程相关,因此我创建了一个小型 SVN 存储库:

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

或者您可以下载 tarball 此处

I've stumbled over a seemingly simple problem while building two libraries and test programs for both.

The Problem: I have two static libraries, libA and libB, and libB depends on libA. I don't want to explicitly link all programs that use libB to libA, I want SCons to see that if a program links to library B it should link to library A as well.

I've built a simple example that illustrates this problem. Since I couldn't find a suitable file hoster and this is programming related, I created a small SVN repository:

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

or you can download a tarball here.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

旧城空念 2024-10-23 00:42:51

正如您所描述的,SCons 没有内置支持表达传递库依赖项,但它的近亲 Waf 确实如此。有关 Waf 书中的“使用”功能,请参阅文档Boost 构建系统也具有此功能使用不同的名称。如果您愿意编写一点 Python 代码,您也可以选择在 SCons 中自己实现这一点。

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

SCons does not have built in support for expressing transitive library dependencies as you describe, but its younger cousin Waf does. See the documentation for the "use" feature in the Waf book. The Boost build system also has this feature under a different name. You can also choose to implement this yourself in SCons if you are willing to code a little bit of Python.

One trick you can use is the ability to define callbacks as construction variables (ie. strings that will be expanded through a Python function call). Have that function call compute the transitive list of libraries you need based on some form of dependency graph you compute at parse time (ie. through method calls found in SConscripts), and you will not have to repeat the full list of libraries for every target or environment.

愛放△進行李 2024-10-23 00:42:51

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

What are libB and libA? Are they libs that are one big .o or are they made up of several .o files?

If the libs are multiple .o files and you are calling a function in one of libB's .o files that uses one of libA's .o files, then you get the libB's .o and the dependent libA .o. If you are using a function in a libB .o that does not depend on anything from libA, then you only get the libB .o file in your binary.

Thus, if you have the command:

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

You will only get the parts needed from both libB and libA.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文