1

我最近意识到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 及其自身的增量链接功能无关。

4

1 回答 1

1

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

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

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

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

我担心 CMake(或任何其他构建系统)不为此提供支持有几个原因。

首先,在这种情况下,您必须缓存目标文件所有可能子集ld -r的结果。这个数字呈指数增长,这使得它不太实用。

其次,除了链接它的目标文件之外,链接应用程序还有更多内容:库链接、动态部分的生成(PLT、重定位等)、放松等,每次都必须从头开始,即使你不知何故设法使用-r。与仅链接目标文件相比,它很容易出现花费更长的时间。

于 2017-02-15T15:45:51.290 回答