我阅读了关于makefile的一个很好的教程,但是当事情变得更复杂时会有点困惑。
我重新构建了我的工作区文件夹并添加了子文件夹:这是我的工作区文件夹的图像:
我试图编辑makefile,但仍然没有成功编译我的文件。
我只需要在make文件中声明头文件,还是需要头文件和cxx文件?
在makefile中,我声明了如何构建版本和调试版本。我试着说:在debug文件夹中创建调试.o文件,并在调试中将它们链接到一个名为exefile的可执行文件。由于我添加了子文件夹include和src,这搞砸了,我现在不知道如何正确编辑makefile。
这是makefile的代码:
#Compiler Flags#
CC = g++
CFLAGS = -Wall -Werror -Wextra
HDIR = include
#Project Files#
SRCS = src/main.cxx src/ex05_01.cxx src/ex05_02.cxx
OBJS = $(SRCS:.cxx=.o)
EXE = exefile
#Debug Build Settings#
DBGDIR = debug
DBGEXE = $(DBGDIR)/$(EXE)
DBGOBJS = $(addprefix $(DBGDIR)/, $(OBJS))
DBGCFLAGS = -g -O0 -DDEBUG
#Release Build Settings#
RELDIR = Release
RELEXE = $(RELDIR)/$(EXE)
RELOBJS = $(addprefix $(RELDIR)/, $(OBJS))
RELFLAGS = -g -O0 -DNDEBUG
.PHONY: all clean debug prep release remake
#default build
debug: $(DBGEXE)
$(DBGEXE): $(DBGOBJS)
$(CC) $(CFLAGS) $(DBGCFLAGS) -o $(DBGEXE) $^
$(DBGDIR)/%.o: %.cxx
$(CC) -c $(CFLAGS) $(DBGCFLAGS) -o $@ $<
# Release rules
release: $(RELEXE)
$(RELEXE): $(RELOBJS)
$(CC) $(CFLAGS) $(RELCFLAGS) -o $(RELEXE) $^
$(RELDIR)/%.o: %.cxx
$(CC) -c $(CFLAGS) $(RELCFLAGS) -o $@ $<
# Other rules
prep: mkdir -p $(DBGDIR) $(RELDIR)
remake:
clean all
clean:
rm -f $(RELEXE) $(RELOBJS) $(DBGEXE) $(DBGOBJS)
谢谢您的帮助!
编辑:我忘了发布make的错误消息:
***没有规则来制作目标
debug/main.o', needed by
debug / exefile'。停止。
main.o: ex05_01.h ... (add more headers if you have)
(对所有.o文件重复)make BUILD=REL <target>
你会得到一个用“REL”值定义的变量BUILD,然后你可以使用ifeq
(参见https://www.gnu.org/software/make/manual/html_node/Conditional-Example.html#Conditional-Example)来相应地设置你的DIR和FLAGS。