c++ - 如何找到链接中的瓶颈?

标签 c++ gcc linker ld

我有一个链接速度非常慢的项目(~ 2 分钟,我觉得这很慢)。 我知道 gold 或 lld 等更快的链接器,但我无法更改链接器。

我在我的代码中使用了很多 C++11 模板,我怀疑某些模板代码可能会在多个目标文件中重复实例化,但我不知道如何确定这是否属实。

我想知道是否有一种方法可以分析整个链接阶段,就像我们分析程序并尝试找到瓶颈一样。例如,我可以使用一种工具来检查如何很多时候一个符号(不必要地)出现在不同的目标文件中,然后在链接过程中被丢弃可以帮助我找出可能是哪个模板代码的原因。上面关于目标文件中重复符号的问题只是我的猜测 - 我需要一个基于证据的方法。然后基于这个发现,我将考虑如何改进我的代码以减少链接时间。

我使用 CMake、GNU g++ 和 ld 作为我的构建工具,并且我在 Linux 平台上工作。

谢谢。

最佳答案

解决此问题的一种方法是使用 nm --demangle --defined-only --extern-only 转储链接中包含的每个目标文件和存档的已定义符号,并构建一个映射{symbol, definition_count}。按 definition_count 从高到低排序此映射并打印。

关于c++ - 如何找到链接中的瓶颈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56891392/

相关文章:

c - 我可以使某些符号仅对其他图书馆成员可见吗?

linux - 使用非标准路径编译 glib

c++ - 让 Chrono C++ 库 (Boost::sandbox) 工作

c++ - 为什么 decltype(auto) 在这里返回一个引用?

c++ - 用输入框提示用户? [C++]

c - 为什么我可以用 GCC 制作的最小编译 exe 是 67KB?

c++ - 使用模板编译 MS VC++ 代码时出现 GCC 错误

c++ - G++ 4.4 编译错误,低版本有效

c# - 将字符串从 .NET 传递到 native (64 位)

c++ - 如果我在库和应用程序中编译了相同的 cpp 文件会怎样?