我开始做一个我想要成长为相当大的项目。我想要创建一个makefile,它将与项目一起成长,而不需要太多的维护。下面是我现在的目录结构。
.
+--src
| +--part1
| | +--part1.c
| | +--part1.h
| +--part2
| | +--part2.c
| | +--part2.h
. .
. .
. .
| +--partN
| | +--partN.c
| | +--partN.h
+--test
| +--part1_tests
| | +--part1_testX.c
| | +--part1_testY.c
. .
. .
. .
+--obj
| +--part1.o
| +--part2.o
. .
. .
. .
| +--partN.o
+--a.out我从来没有这样规模的项目,也不需要为这样的项目制作文件。我该如何设计一个makefile呢?谢谢!
发布于 2016-11-25 07:38:37
做这件事有不同的方法,但我会从不让makefile与项目一起成长开始。相反,我将使用常规结构来定义规则,以处理一个目录中的一个codefile的项目,以及具有上千个文件的大型项目。
例如,让我们使用一下您的结构(未经测试的可能有一些排版,我假设您从project开始制作):
# we nead the header directory
INCDIRS = src
# collect every cpp file
CXXSRCS = $(shell find src/ -type f -name '*.cpp' 2>/dev/null)
# now generate the object file names
OBJSTMP = $(CXXSRCS:%.cpp=obj/%.o)
# compiled the source file
obj/%.o: src/%.cpp
$(CXX) ${CXXFLAGS} $(foreach bin,${INCDIRS},-I${bin}) -o "$@" "$<"现在假设您的main在part1.cpp中
ifneq (,$(wildcard src/part1/part1.cpp))
# I just dont like a.out...
executable=${APPLICATION_NAME}
# now lets build the exe:
${executable}: ${OBJS}
$(LD) $(LDFLAGS) -o $@ $^
endif最后一件事是化妆品:
.PHONY: clean all
all: install
compile: ${OBJS}
package: compile ${executable}
#now we can move the object files to were they should be
mv -f obj/part*/* obj/
install: package无论您的项目有多大,这个makefile都会执行您的一些步骤。只是想给你个主意。我忽略了test_files。但是,考虑到前面的情况,您可以像我一样收集测试源,就像我使用正常的源一样。
因此,我的观点是,您的makefile完全没有理由必须与项目的大小一起增长,而只是因为它的复杂性。
有关更多信息,请参阅stackoverflow的文档,这里有大量有关makefile的信息。
希望能帮上忙
Kai
https://stackoverflow.com/questions/40792792
复制相似问题