在Makefile中使用后缀规则
假设有a.c,b.c,c.c,tt/at.c,tt/bt.c,fff/af.c,fff/bf.c。所以我把Makefile做成这样:在Makefile中使用后缀规则,makefile,Makefile,假设有a.c,b.c,c.c,tt/at.c,tt/bt.c,fff/af.c,fff/bf.c。所以我把Makefile做成这样: OBJS=a.o b.o c.o SRCS=$(OBJS:.o=.cc) OBJS_TT=at.o bt.o SRCS_TT=tt/at.c tt/bt.c OBJS_FFF=af.o bf.o SRCS_FFF=fff/af.c fff/bf.c TARGET=test .cc.o: gcc -c $< $(OBJS_TT):
OBJS=a.o b.o c.o
SRCS=$(OBJS:.o=.cc)
OBJS_TT=at.o bt.o
SRCS_TT=tt/at.c tt/bt.c
OBJS_FFF=af.o bf.o
SRCS_FFF=fff/af.c fff/bf.c
TARGET=test
.cc.o:
gcc -c $<
$(OBJS_TT):
gcc -c $(SRCS_TT)
$(OBJS_FFF):
gcc -c $(SRCS_FFF)
all:
gcc -o $(TARGET) $(OBJS) $(OBJS_TT) $(OBJS_FFF)
OBJS=a.o b.o c.o
SRCS=$(OBJS:.o=.cc)
OBJS_TT=at.o bt.o
SRCS_TT=TT/at.c TT/bt.c
OBJS_FFF=af.o bf.o
SRCS_FFF=FFF/af.c FFF/bf.c
目标=测试
.cc.o:
gcc-c$<
美元(OBJS_TT):
gcc-c$(SRCS\U TT)
美元(OBJS_FFF):
gcc-c$(SRCS\U FFF)
全部:
gcc-o$(目标)$(OBJS)$(OBJS_TT)$(OBJS_FFF)
如果tt目录中的C文件被添加,我必须在SRCS_tt&OBJS_tt中添加文件名。
有没有改进make文件的方法?
如何使用后缀规则处理所有c文件(包括目录中的文件)?当源文件位于不同目录中时,一个常见的解决方案是在生成目录中构建同构的目录结构。通过这种方式,您可以拥有多个具有相同文件名(例如,
util.cc
)但位于不同目录中的源,并且对象文件不会发生冲突,因为它们构建在不同的目录中
创建同构构建目录结构(也具有自动生成的头依赖项)的工作示例:
build_dir := build
all : ${build_dir}/test
.SECONDEXPANSION:
.SECONDARY:
test_srcs := a.cc b.cc x/c.cc y/d.cc
${build_dir}/test : ${test_srcs:%.cc=${build_dir}/%.o} | ${build_dir}/
g++ -o $@ ${LDFLAGS} ${LDLIBS} $^
# Include the auto-generated dependencies.
-include ${test_srcs:%.cc=${build_dir}/%.d}
# Compile and generate dependency files.
${build_dir}/%.o : %.cc | $$(dir $$@)
g++ -o $@ -c -MD -MP ${CPPFLAGS} ${CXXFLAGS} $<
# Directory build rules. while loop to handle races on mkdir during parallel builds.
${build_dir}/%/ : | ${build_dir}/
while ! mkdir -p $@; do true; done
# Build root directory rule.
${build_dir}/ :
mkdir -p $@
# Don't try to rebuild these, these are generated when compiling.
${build_dir}/%.d : ;
clean :
rm -rf ${build_dir}
.PHONY : all clean
你能澄清一下你想在哪里创建“.o”吗?后缀规则将对象放在“tt/”和“fff/”中。直接规则将对象保留在当前目录中
$ mkdir x y
$ touch b.cc x/c.cc y/d.cc
$ echo "int main() {}" > a.cc
$ make
mkdir -p build/
g++ -o build/a.o -c -MD -MP a.cc
g++ -o build/b.o -c -MD -MP b.cc
while ! mkdir -p build/x/; do true; done
g++ -o build/x/c.o -c -MD -MP x/c.cc
while ! mkdir -p build/y/; do true; done
g++ -o build/y/d.o -c -MD -MP y/d.cc
g++ -o build/test build/a.o build/b.o build/x/c.o build/y/d.o
$ tree build/
build/
├── a.d
├── a.o
├── b.d
├── b.o
├── test
├── x
│ ├── c.d
│ └── c.o
└── y
├── d.d
└── d.o
2 directories, 9 files
$ make
make: Nothing to be done for 'all'.
$ make clean
rm -rf build