gpt4 book ai didi

c++ - distcc 中的链接阶段

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:12:11 25 4
gpt4 key购买 nike

在使用 distcc 构建项目时,链接阶段是在本地完成的,而不是像编译那样发送到其他计算机上完成的,这有什么特别的原因吗?阅读 distcc 白页并没有给出明确的答案,但我猜测链接目标文件所花费的时间与编译相比并不是很重要。有什么想法吗?

最佳答案

distcc 的工作方式是在本地预处理输入文件,直到创建单个文件翻译单元。然后该文件通过网络发送并编译。在那个阶段,远程 distcc 服务器只需要一个编译器,它甚至不需要项目的头文件。然后将编译的输出移回客户端并在本地存储为目标文件。请注意,这意味着不仅链接,而且预处理也在本地执行。这种工作分工对于其他构建工具是常见的,例如 ccache(始终执行预处理,然后它尝试使用先前缓存的结果解析输入,如果成功则返回二进制文件而不重新编译)。

如果您要实现分布式链接器,则必须确保网络中的所有主机都具有完全相同的配置,否则您将不得不在一个批处理中发送操作所需的所有输入。这意味着分布式编译会产生一组目标文件,所有这些目标文件都必须通过网络推送,以便远程系统链接并返回链接的文件。请注意,这可能需要链接器路径中引用和存在的系统库,但不存在于链接器命令行中,因此“预链接”必须确定实际需要发送哪些库集。即使可能,这也需要本地系统猜测/计算所有真实的依赖关系并发送它们,这会对网络流量产生很大影响,并且实际上可能会减慢该过程,因为发送成本可能大于链接成本——如果获取依赖项的成本本身并不像链接那么昂贵。

我目前从事的项目有一个超过 100M 的静态链接可执行文件。静态库的大小不等,但如果分布式系统认为最终的可执行文件是远程链接的,那么它可能需要的网络流量是最终可执行文件的三到五倍(模板、内联……所有这些都出现在所有包含它们的翻译单元,因此会有多个拷贝在网络中传播。

关于c++ - distcc 中的链接阶段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3756621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com