我正在 Windows 平台上使用 gcc 和 MinGW。我有一个包含两个 *.c 文件的目录:main.c 和 funcs.c我正在使用以下生成文件:CC=gccCFLAGS=-cLDFLAGS=SOURCEDIR = srcBUILDDIR = buildSOURCES=$(wildcard $(SOURCEDIR)/*.c)OBJECTS=$(patsubst $(SOURCEDIR)/%.c,$(BUILDDIR)/%.o,$(SOURCES))LIBRARIES=-L/mingw64/libINC= -I./includeEXECUTABLE=testLinkVPATH = src include buildall: $(SOURCES) $(EXECUTABLE)$(EXECUTABLE): $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) $(LIBRARIES) -o ./dist/$@$(OBJECTS): $(SOURCES) $(CC) $(INC) $(CFLAGS) $< -o $@这应该采用 *.c 文件并生成具有相同名称的 *.o 文件。但是我在 make 上得到以下输出 -$ makegcc -I./include -c src/funcs.c -o build/funcs.ogcc -I./include -c src/funcs.c -o build/main.ogcc build/funcs.o build/main.o -L/mingw64/lib -o ./dist/testLink接下来当然是一堆多重定义错误。正如您从前两行看到的那样,它采用相同的 *.c 文件并将其两次编译为两个不同的 *.o 文件。我是 makefile 的新手,但我认为我的 $(OBJECTS) 规则有问题,我很确定是 $谢谢!詹姆士 最佳答案 这个规则:$(OBJECTS): $(SOURCES) $(CC) $(INC) $(CFLAGS) $< -o $@扩展为:funcs.o main.c: funcs.c main.c $(CC) $(INC) $(CFLAGS) $< -o $@这相当于:funcs.o: funcs.c main.c $(CC) $(INC) $(CFLAGS) $< -o [email protected]: funcs.c main.c $(CC) $(INC) $(CFLAGS) $< -o $@$< 指的是第一个依赖项 (funcs.c),因此您的 Makefile 试图从同一来源生成 funcs.o 和 main.o。您只需要使用 % 通配符匹配的通用规则:%.o: %.c $(CC) $(INC) $(CFLAGS) $< -o $@见 https://www.gnu.org/software/make/manual/html_node/Pattern-Rules.html关于c - Makefile 未编译目录中的所有 C 文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45869712/ 10-15 18:09