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

标签 gcc makefile cmake linker incremental-linking

我最近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.ob.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/

相关文章:

c - GCC 中结构变量的作用域规则

使用Makefiles编译不同目录下的C程序

android - 在 Android Studio/Gradle 中编译 bundle 库的问题

linux - CMake find_path 适用于 Linux 但不适用于 MingW。我该如何解决?

build - 了解 CMake 背后的目的

c - 嵌入式系统中的 malloc

c++从c'tor返回+用于错误处理的默认返回值

c - 使用 C 代码连接到 Monetdb 时出现链接错误

makefile - 重击 : What is the difference between PWD and CURDIR?

c - 使用gdb调试时未找到调试符号