gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:39:37 27 4
gpt4 key购买 nike

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

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

Workspace Folder Tree

我尝试编辑 makefile,但仍然无法成功编译我的文件。

我只需要在 make 文件中声明头文件,还是同时需要头文件和 cxx 文件?

在 makefile 中,我声明了如何构建发布版和调试版。我试着说:在调试文件夹中创建调试 .o 文件,并在调试中将它们链接到一个名为 exefile 的可执行文件中。由于我添加了子文件夹 include 和 src,这变得一团糟,我现在不知道如何正确编辑 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 的错误消息:

*** No rule to make target debug/main.o', needed bydebug/exefile'. Stop.

最佳答案

  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。

关于c++ - 我是否需要在 make 文件中声明头文件或 cxx 文件或两者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54850401/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com