使用 GNU Make 编译不存在的对象文件



我已经学习C++几个月了,只需使用编辑器和我的终端来编译和运行我的程序。但是我认为我的项目需要更正式一些,所以我正在尝试学习如何构建适当的项目文件结构以及如何使用 Make。

目前,我正在使用GNU Make 4.1。但是我在使用 Make 创建对象文件时遇到问题,收到错误:

make: *** No rule to make target 'build/%.o', needed by 'main'.  Stop.

我一直在寻找解决方案,但到目前为止都没有奏效。

这是我的制作文件:

# Specify compiler
CC=gcc
# Specify linker
LINK=gcc
# Specify flags
CPPFLAGS = -Wall -g
# Specify directories
SRCDIR = ./src
OBJDIR = ./build
# Compile object files
$(OBJDIR)/%.o : $(SRCDIR)/%.cpp
$(CC) -c -o $@ $< $(CPPFLAGS)
# Compile object files into binary
main : $(OBJDIR)/%.o
$(CC) -o $@ $^

考虑最终规则...

# Compile object files into binary
main : $(OBJDIR)/%.o
$(CC) -o $@ $^

不幸的是,$(OBJDIR)/%.o没有按照您需要的方式进行扩展。 假设所有源文件都在$(SRCDIR)您可以创建一个包含其名称的变量...

SRCFILES := $(wildcard $(SRCDIR)/*.cpp)

现在创建一个包含相应对象文件路径的变量...

OBJFILES := $(patsubst $(SRCDIR)/%.cpp,$(OBJDIR)/%.o,$(SRCFILES))

现在$(OBJFILES)应该包含main所依赖的对象文件路径列表。 所以最终的规则变成了...

main: $(OBJFILES)
$(CC) -o $@ $^

相关内容

最新更新