我最近有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及其自身的增量链接功能。
答案 0 :(得分:1)
我最近开始意识到gcc的增量链接功能
我认为我们需要澄清一些条款。增量链接是链接器功能,允许您在只有一小部分目标文件发生更改时加快链接。它是通过重复使用上一个链接的结果来实现的。
GNU ld没有这样的功能。它可以做的是可重新定位的链接,即将几个对象合并为一个。如果您将if
和a.o
关联到b.o
然后修改ab.o
,则无法重复使用可重定位链接的结果,因此您必须重新关联从头开始a.o
(与诚实的增量链接相反)。
我想让CMake尝试使用增量链接来获取它们,而不是从头开始链接
我担心CMake(或任何其他构建系统)由于多种原因而无法为此提供支持。
首先,在这种情况下,您必须为您的目标文件的所有可能的子集缓存ab.o
的结果。这个数字呈指数增长,这使得它非常实用。
其次,除了链接它的目标文件之外,还有更多链接应用程序:库链接,生成动态部分(PLT,重定位等),放松等等,这些都必须每次都从头开始,甚至如果你以某种方式设法使用ld -r
。与链接目标文件相比,它可以很容易地花费更长的时间。