如何确定最快的链接顺序?

owa*_*agh 38 c++ performance linker ld

我有大约50个不同的静态库链接到我的c ++项目,链接平均需要70s.

我发现这次移动了库的链接顺序.这是预期的,我想如果链接器不必在它构建到该点的整个符号表中继续搜索一组符号.

我想我可以用"nm"来获取静态库之间的依赖图.但是,这只会给我一个"正确"的链接顺序.获得最快链接顺序所涉及的因素是什么?

我觉得它会与上面提到的依赖图有关,通过尝试最小化一些数量的遍历,但我真的不确定哪个.

任何帮助,将不胜感激.

我主要使用intel编译器和gcc编译器.当我用top检查时,它们似乎都在使用GNU ld链接器.希望这可以帮助...

所以,为了更清楚地说明我想要问的内容,我已经知道如何从一组静态库中获得1遍顺序.我自己编写了这个脚本,但正如Olaf的回答所示,有一些众所周知的工具可以做到这一点.

我的问题是,我已经有两个1遍链接排序,其中一个在~85秒内运行,另一个在〜70秒内运行.很明显,我们可以在一次通过订单中进行更多优化.

Nei*_*eil 7

作为替代方案,为什么不尝试将库编译为共享库而不是静态库?

在我工作的地方,一个大型项目的链接时间大约是6分钟,这只适用于5个图书馆!

我的解决方案是(对于调试版本),按字母顺序创建.so文件(libA.so,libB.so等),因此每个单独的链接不会太长,最后的链接要短得多,因为所有(部分)链接以前做过.发布版本是以老式的方式构建的,因为我的新方法存在"危险".

我设法使用这种方法将1个模块的编译/链接周期从6分钟缩短到10秒.


Ola*_*che 6

过去,静态库中对象的顺序很重要.您可以使用以下方法对对象进行排序

$ lorder*.o | tsort的

也许你可以对你的主要对象和库做同样的事情,例如lorder main.o test.o libsome.a libthing.a | tsort.看看男人的命令