使用GNU Make编译不存在的目标文件

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

现在,我已经通过使用编辑器和终端来编译和运行程序来学习C ++。但是我发现我的项目需要更加正式,因此我正在尝试学习如何构建适当的项目文件结构以及如何使用Make。

当前,我正在使用GNU Make 4.1。但是我无法使用Make创建目标文件,收到错误:

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

我一直在寻找解决方案,但到目前为止没有一个工作。

这是我的makefile:

# 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 $@ $^
makefile
1个回答
0
投票

考虑最终规则...

# 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 $@ $^
© www.soinside.com 2019 - 2024. All rights reserved.