在 MSVC 中,这称为“增量链接”。有趣的是,我发现 GCC 可能在某种程度上支持它,尝试使用 GCC 的“-Wl,-i”或“-Wl,-r”参数(CLang 实际上也应该支持,因为这些“-Wl”参数只是传递给ld)。
我以前从未使用过它,但我使用以下 makefile 完成了这项工作:
OBJS := a.o b.o c.o main.o
all: test_app
test_app: test_app.reloc
g++ -o $@ $^
# build a "relocatable" object for incremental linking (either -i or -r)
test_app.reloc: $(OBJS)
g++ -Wl,-i -nostdlib -nostartfiles -o $@ $^
$(OBJS): makefile
%.o: %.cpp
g++ -c -o $@ $<
这构建了应用程序,但我不完全确定它在内部做了什么,如果它真的在 MSVC 中完成了类似“增量链接”的操作。
特别是,使用“-Wl,-i”时需要参数“-nostdlib”,这样默认库就不会传递给ld(然后找不到它们 - 没有它我有错误“/usr/bin/ld: cannot find -lgcc_s”)。
另一个实际上可能会更好的版本(不确定,这需要在更大的应用程序上进行测试,以查看单个对象更新的链接时间是否有所增加):
OBJS := a.ro b.ro c.ro main.ro
all: test_app
test_app: $(OBJS)
g++ -o $@ $^
%.o: %.cpp
g++ -c -o $@ $<
%.ro: %.o
g++ -Wl,-i -nostdlib -nostartfiles -o $@ $<
- 基本上为每个对象创建可重定位文件(这可能是 obj 文件链接到可执行文件的重要部分),然后只更新必要的可重定位文件。对于最后的链接步骤,使用可重定位文件将所有内容链接在一起(但之前已经完成了部分链接)。
还可以创建对象文件的“组”,将其分组到一个可重定位文件中,这样最后它们的数量就会减少(但不确定这是否会在最后带来任何东西)。