gpt4 book ai didi

linker - 链接比创建静态库更快时使用 --start-group 和 --end-group 吗?

转载 作者:行者123 更新时间:2023-12-04 02:21:43 25 4
gpt4 key购买 nike

如果一个人在自己的构建脚本中构建静态库,并且想要使用这些静态库来链接最终的可执行文件,那么命令一提到 .a文件很重要:

g++ main.o hw.a gui.a -o executable

如果 gui.a使用 hw.a 中定义的东西链接将失败,因为当时 hw.a被处理时,链接器还不知道稍后需要该定义,并且不将其包含在 being.generated 可执行文件中。手动摆弄链接器行是不切实际的,因此解决方案是使用 --start-group--end-group这使得链接器在库中运行两次,直到不再找到 undefined symbol 。
g++ main.o -Wl,--start-group hw.a gui.a -Wl,--end-group -o executable

但是 GNU ld 手册说

Using this option has a significant performance cost. It is best to use it only when there are unavoidable circular references between two or more archives.



所以我认为最好全部拿走 .a文件并将它们合并为一个 .a带有索引的文件( -s GNU ar 的选项),它说明文件需要链接的顺序。然后一个只给那个 .a文件到 g++ .

但我想知道这是否比使用组命令更快或更慢。这种方法有什么问题吗?我也想知道,有没有更好的方法来解决这些相互依赖的问题?

编辑:我编写了一个程序,它采用 .a 的列表文件并生成合并的 .a文件。适用于 GNU 通用 ar格式。将 LLVM 的所有静态库打包在一起就像这样
$ ./arcat -o combined.a ~/usr/llvm/lib/libLLVM*.a

我将速度与打开所有 .a 进行了比较手动文件,然后将它们放入新的 .a文件使用 ar ,重新计算索引。使用我的 arcat工具,我得到了大约 500 毫秒的一致运行时间。使用手动方式,时间变化很大,大约需要2s左右。所以我认为这是值得的。

Code is here .我把它放到公共(public)领域:)

最佳答案

您可以使用 lorder 确定顺序和 tsort实用程序,例如

libs='/usr/lib/libncurses.a /usr/lib/libedit.a'
libs_ordered=$(lorder $libs | tsort)

导致 /usr/lib/libedit.a /usr/lib/libncurses.a因为 libedit 依赖于 libncurses。

这可能只是 --start-group 以上的好处如果你不运行 lordertsort再次为每个链接命令。此外,它不允许像 --start-group 这样的相互/循环依赖。做。

关于linker - 链接比创建静态库更快时使用 --start-group 和 --end-group 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7053082/

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