我是否需要在make文件中声明头文件或cxx文件或两者?

问题描述 投票:1回答:1

我阅读了关于makefile的一个很好的教程,但是当事情变得更复杂时会有点困惑。

我重新构建了我的工作区文件夹并添加了子文件夹:这是我的工作区文件夹的图像:

Workspace Folder Tree

我试图编辑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 bydebug / exefile'。停止。

c++ macos makefile visual-studio-code
1个回答
0
投票
  1. 您还应该包含头文件依赖项的规则。假设main.cxx依赖于ex05_01.h,当ex05_01.h发生更改时,您需要重新编译main.cxx。像这样的东西可以完成这项工作: main.o: ex05_01.h ... (add more headers if you have) (对所有.o文件重复)
  2. 您的调试和发布版本只有几点不同:输出文件夹DIR和FLAGS中的DEBUG / NDEBUG定义标志。为了避免重复所有设置,您可以重构并创建公共目标,然后使用变量上的条件在您的设置之间切换,例如,如果您像这样运行make: make BUILD=REL <target> 你会得到一个用“REL”值定义的变量BUILD,然后你可以使用ifeq(参见https://www.gnu.org/software/make/manual/html_node/Conditional-Example.html#Conditional-Example)来相应地设置你的DIR和FLAGS。
© www.soinside.com 2019 - 2024. All rights reserved.