我可以让CMake使用gcc增量链接生成Makefile吗?

时间:2017-02-15 13:03:14

标签: gcc makefile cmake linker incremental-linking

我最近有become aware gcc的增量链接功能,我想使用它。问题是,我不编写自己的Makefile - 我使用CMake。文件间依赖关系和目标基本相同,但我想让CMake尝试使用增量链接获取它们而不是从头开始链接?

此外,如果可以在库中的文件中使用它,即在.o文件中重新编译一个.a时,而不是在链接可执行文件时重新考虑整个文件,其中的单个.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及其自身的增量链接功能。

1 个答案:

答案 0 :(得分:1)

  

我最近开始意识到gcc的增量链接功能

我认为我们需要澄清一些条款。增量链接是链接器功能,允许您在只有一小部分目标文件发生更改时加快链接。它是通过重复使用上一个链接的结果来实现的。

GNU ld没有这样的功能。它可以做的是可重新定位的链接,即将几个对象合并为一个。如果您将ifa.o关联到b.o然后修改ab.o,则无法重复使用可重定位链接的结果,因此您必须重新关联从头开始a.o(与诚实的增量链接相反)。

  

我想让CMake尝试使用增量链接来获取它们,而不是从头开始链接

我担心CMake(或任何其他构建系统)由于多种原因而无法为此提供支持。

首先,在这种情况下,您必须为您的目标文件的所有可能的子集缓存ab.o的结果。这个数字呈指数增长,这使得它非常实用。

其次,除了链接它的目标文件之外,还有更多链接应用程序:库链接,生成动态部分(PLT,重定位等),放松等等,这些都必须每次都从头开始,甚至如果你以某种方式设法使用ld -r。与链接目标文件相比,它可以很容易地花费更长的时间。