我有以下makefile:
all: a.out b.out
.PHONY: gen_hdr1
gen_hdr1:
#call script 1 that generates x.h
rm a.o #try to force rebuild of a.cpp
.PHONY: gen_hdr2
gen_hdr2:
#call script 2 that generates x.h
rm a.o #try to force rebuild of a.cpp
b.out: gen_hdr2 a.o
g++ -o b.out a.o
a.out: gen_hdr1 a.o
g++ -o a.out a.o
*.o : *.cpp
g++ -c $< -o $@
a.cpp includex x.h
我想做什么:
运行makefile的输出是:
#call script 1 that generates x.h
rm -f a.o #try to force rebuild of a.cpp
g++ -c -o a.o a.cpp
g++ -o a.out a.o
#call script 2 that generates x.h
rm -f a.o #try to force rebuild of a.cpp
g++ -o b.out a.o
g++: a.o: No such file or directory
g++: no input files
make: *** [b.out] Error 1
基本上,在构建App B时找不到a.o. 如何强制make系统重建它?
答案 0 :(得分:2)
对于这类问题的良好解决方案是使用单独的构建对象文件夹,每个目标还有一个子文件夹。
所以你会有类似的东西:
build/first/a.o: src/a.cpp gen/a.h
# Do you stuff in here
gen/a.h:
# Generate you .h file if needed
build/second/a.o: src/a.cpp gen/a.h
# Same thing
使用此解决方案,您将在build文件夹中拥有所有构建对象,因此clean命令更简单:
clean:
rm -rf build/*
rm -rf gen/*
rm -rf bin/*
你应该确保唯一的事情就是在构建之前存在目录,但这不是一件可行的工作:)
如果你必须生成两个版本的a.h,你可以使用相同的设计(gen / first&amp; gen / second文件夹)。
希望它有所帮助,告诉我,如果我错过了什么