生成文件:自动生成二进制文件的依赖项
Makefile: automatic generation of dependencies for binaries
我想在项目的 Makefile 中"完全"自动化依赖生成过程。到目前为止,我已经按照这个关于自动依赖项的教程进行操作,它工作得很好。只有一个问题:这仅适用于头文件依赖项,因此它会自动检测 bin_1.o 是否依赖于 header_1.h 和 header_2.h。但是,我可以直接将头文件依赖项转换为对象文件依赖项。比如说,其中一个自动生成的依赖项文件说
bin_1.o: bin_1.cpp header_1.h header_2.h
因此,在链接步骤中,我可以立即得出结论,我需要将文件bin_1.o、header_1.o 和 header_2.o 链接在一起,以便生成二进制bin_1。换句话说,bin_1的相应依赖项文件应该具有
bin_1: bin_1.o header_1.o header_2.o
这正是我努力实现的目标。上面描述的翻译是由一个小的python脚本完成的,extract_dependencies.py,我的Makefile的精简版本看起来像这样:
binaries = bin_1 bin_2 bin_3
SRCS := $(wildcard *.cpp)
all: $(binaries)
# dependencies
DEPDIR := .d
$(shell mkdir -p $(DEPDIR) >/dev/null)
DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.Td
COMPILE = $(CC) $(DEPFLAGS) $(CFLAGS) -c
POSTCOMPILE = mv -f $(DEPDIR)/$*.Td $(DEPDIR)/$*.d
GENERATE_BINARY_DEPS = python extract_dependencies.py $(DEPDIR)/$*.d > $(DEPDIR)/$*.bin.d
$(DEPDIR)/%.d: ;
$(DEPDIR)/%.bin.d: ;
.PRECIOUS: $(DEPDIR)/%.d $(DEPDIR)/%.bin.d
$(binaries): % : %.o $(DEPDIR)/%.bin.d
${CC} ${CFLAGS} $(shell cat .d/$@.bin.d | cut -d ' ' -f 2-) ${LDFLAGS} -o $@
%.o: %.cpp
%.o: %.cpp $(DEPDIR)/%.d
$(COMPILE) $<
$(POSTCOMPILE)
$(GENERATE_BINARY_DEPS)
clean:
rm -vf *.o
rm -vf bin_1 bin_2 bin_3
realclean:
$(MAKE) clean
rm -fr .d
-include $(patsubst %,$(DEPDIR)/%.d,$(basename $(SRCS)))
-include $(patsubst %,$(DEPDIR)/%.bin.d,$(basename $(SRCS)))
现在问题来了:为了使其工作,我需要运行"make"两次。生成 *.bin.d 依赖项文件,但仅在第二次运行时,Make 实际上"意识到"说 header_1.o 对于bin_1也是必需的,而不仅仅是 bin_1.o。在第一次运行时,它会尝试将所有对象文件链接在一起,而无需先实际构建所有对象文件。
有没有办法解决这个问题,即在第一次通过时就把一切都做好了?
谢谢!
由于 Make 将在 1st 读入整个制作文件,然后执行目标。 很难一次性更新 %.bin.d。或者,我们可以尝试在内部触发第二个"make",例如,
ifneq ($(STAGE),2)
$(binaries): % : %.o $(DEPDIR)/%.bin.d
@{MAKE} $(binaries) STAGE=2
else
#2nd pass
$(binaries):
${CC} ${CFLAGS} -o $@ $(shell cat .d/$@.bin.d | cut -d ' ' -f 2-) ${LDFLAGS}
endif
相关文章:
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 在 C++ 中将双精度变量写入二进制文件
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- 对在不同二进制文件中创建的对象文件的依赖关系
- 在 NDK 上编译两个带有 gradle 的项目,其中一个依赖于另一个的二进制文件
- 如何将所有依赖项和共享库编译为一个二进制文件
- 如何在二进制文件中包含共享库依赖项(不使用.deb或.rpm)和/或针对PulseAudio的静态链接
- 如何设置二进制文件所依赖的 DLL 的名称
- 生成文件:自动生成二进制文件的依赖项
- 生成一个没有 dll 依赖项的C++二进制文件
- 从Windows二进制文件中删除msvcp90d.dll依赖
- CMake从Ubuntu为RedHat EL6构建了一个独立的二进制文件,其中包含依赖的共享库
- 将依赖项添加到库中,并将它们添加到依赖于该库的二进制文件中
- 如何制作不依赖于 .so 文件的可执行二进制文件
- 在Netbeans中没有链接的依赖c++项目二进制文件