我最近become aware gcc 的增量链接功能,我想使用它。问题是,我不编写自己的 Makefile - 我使用 CMake。文件间依赖关系和目标本质上是相同的,但我想让 CMake 尝试使用增量链接而不是从头开始链接来获取它们?
此外,如果甚至对于库内的文件也可以这样做,即当您在 .a
文件中重新编译一个 .o
时,而不是整个文件时链接可执行文件时重新考虑,仅重新考虑/重新应用其中的单个 .o
。
为了说明这一点,假设我的 CMakeLists.txt
有:
add_executable(
foo
a.cpp
b.cpp
c.cpp
)
现在,当 a.cpp
更改时,我们会得到一个编译 a.cpp
-> a.o
然后是常规链接 a.o b.o c.o
-> foo
。我希望它是 a.o foo Something_else_maybe -> foo
注意:这个问题与 MSVC 及其自身的增量链接功能无关。
最佳答案
I've recently become aware of gcc's incremental linking feature
我认为我们需要澄清一些术语。增量链接是链接器功能,可让您在仅一小部分目标文件发生更改时加快链接速度。它通过重新使用先前链接的结果来实现这一点。
GNU ld 没有这样的功能。它可以做的是可重定位链接,即将多个对象合并为一个。如果将 a.o
和 b.o
链接到 ab.o
,然后修改 a.o
,则无法重用可重定位链接的结果,因此您必须从头开始重新链接 ab.o
(而不是诚实的增量链接)。
I want to have CMake try to obtain them using incremental linking rather than linking from scratch
恐怕 CMake(或任何其他构建系统)由于多种原因不提供对此的支持。
首先,在这种情况下,您必须为目标文件的所有可能的子集缓存ld -r
的结果。这个数字呈指数增长,这使得它不切实际。
其次,除了链接其目标文件之外,还有更多链接应用程序的内容:库链接、动态部分的生成(PLT、重定位等)、松弛等,每次都必须从头开始完成,甚至如果你设法使用 -r
。它很容易比链接目标文件花费更长的时间。
关于gcc - 我可以让 CMake 使用 gcc 增量链接生成 Makefile 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42250190/