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

4urapxun  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(150)

我最近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和它自己的增量链接功能。
hgc7kmma

hgc7kmma1#

我最近开始了解GCC的增量链接特性
我认为我们需要澄清一些术语。增量链接是一种链接器功能,它允许您在只有一小部分目标文件发生更改时加快链接速度。它通过重复使用前一个链接的结果来实现。
GNU ld没有这样的特性。它可以做的是可重定位链接,即将多个对象合并为一个。如果您将a.ob.o链接到ab.o,然后修改a.o,它将无法重用可重定位链接的结果,因此您必须从头开始重新链接ab.o(与诚实的增量链接相反)。
我想让CMake尝试使用增量链接而不是从头开始链接来获取它们
我担心CMake(或任何其他构建系统)不提供对此的支持,原因有几个。
首先,在这种情况下,您必须为对象文件的 * 所有可能的子集 * 缓存ld -r的结果。这个数字呈指数增长,这使得它不切实际。
其次,除了链接应用程序的对象文件之外,还有更多的链接应用程序:库链接、动态部分的生成(PLT、重定位等)、松弛等。这将不得不从头开始每一次,即使你设法使用-r。它可以很容易地出现,需要更长的时间比只是链接对象文件。

相关问题