我是新手,我正在尝试一次构建多个二进制文件,这些二进制文件都依赖于相同的对象。我的 makefile 看起来像这样:
BINARY=s1_c1 s1_c2 s1_c3
CODEDIRS=./challenges ./src
INCDIRS=. ./include/
COMPILER=gcc
OPT=-O2
DEBUG=-Og
DEPFLAGS=-MP -MD
CFLAGS1=-Wall -g $(foreach D, $(INCDIRS), -I$(D)) $(DEBUG) $(DEPFLAGS)
CFLAGS2=-Wall $(foreach D, $(INCDIRS), -I$(D)) $(DEPFLAGS)
CFILES=$(foreach D, $(CODEDIRS), $(wildcard $(D)/*.c))
MAINCFILES = $(foreach V, $(CFILES), $(if $(filter ./challenges/% , $V),$V))
OBJECTS = $(patsubst %.c,%.o,$(CFILES))
MAINOBJECTS = $(foreach V, $(OBJECTS), $(if $(filter ./challenges/% , $V),$V))
LIBOBJECTS = $(foreach V, $(OBJECTS), $(if $(filter ./src/% , $V),$V))
DEPFILES = $(patsubst %.c,%.d,$(CFILES))
all : $(BINARY)
.PHONY: all
s1_c1 : $(LIBOBJECTS) s1_c1.o
$(COMPILER) (-o) $@ $^
s1_c2 : $(LIBOBJECTS) s1_c2.o
$(COMPILER) (-o) $@ $^
s1_c3 : $(LIBOBJECTS) s1_c3.o
$(COMPILER) (-o) $@ $^
%.o : %.c
$(COMPILER) $(CFLAGS1) -c -o $@ $^
clean:
rm -rf $(BINARY) $(LIBOBJECTS) $(DEPFILES)
包含主要功能的 s1_c* 源文件位于名为 ./challenges 的目录中,其他文件位于 ./src 目录中。 ./include 包含./src 的.h。二进制文件应该构建在另一个名为 bin 的目录中。每个目录都位于包含 makefile 的主目录中。当我运行 make 时,我收到标题中的错误。我猜这个问题来自于我对自动变量和模式规则的误解,但我无法通过 gnu 文档得到正确的结果。预先感谢您!
正如其他人在评论中所说,您需要添加目录名称以告诉 make 在哪里可以找到这些 .o 文件。 与模式规则相结合,您的 makefile 会短得多。
BINARY=s1_c1 s1_c2 s1_c3
CODEDIRS=./challenges ./src
INCDIRS=. ./include/
COMPILER=gcc
OPT=-O2
DEBUG=-Og
DEPFLAGS=-MP -MD
CFLAGS1=-Wall -g $(foreach D, $(INCDIRS), -I$(D)) $(DEBUG) $(DEPFLAGS)
CFLAGS2=-Wall $(foreach D, $(INCDIRS), -I$(D)) $(DEPFLAGS)
CFILES=$(foreach D, $(CODEDIRS), $(wildcard $(D)/*.c))
OBJECTS = $(patsubst %.c,%.o,$(CFILES))
LIBOBJECTS = $(foreach V, $(OBJECTS), $(if $(filter ./src/% , $V),$V))
DEPFILES = $(patsubst %.c,%.d,$(CFILES))
all : $(BINARY)
.PHONY: all
$(BINARY): %: $(LIBOBJECTS) challenges/%.o
$(COMPILER) -o $@ $^
%.o : %.c
$(COMPILER) $(CFLAGS1) -c -o $@ $^
clean:
rm -rf $(BINARY) $(LIBOBJECTS) $(DEPFILES)