gpt4 book ai didi

c - Makefile 未编译目录中的所有 C 文件

转载 作者:行者123 更新时间:2023-12-05 00:14:53 26 4
gpt4 key购买 nike

我正在 Windows 平台上使用 gcc 和 MinGW。我有一个包含两个 *.c 文件的目录:
main.c 和 funcs.c

我正在使用以下生成文件:

CC=gcc
CFLAGS=-c
LDFLAGS=
SOURCEDIR = src
BUILDDIR = build
SOURCES=$(wildcard $(SOURCEDIR)/*.c)
OBJECTS=$(patsubst $(SOURCEDIR)/%.c,$(BUILDDIR)/%.o,$(SOURCES))
LIBRARIES=-L/mingw64/lib
INC= -I./include
EXECUTABLE=testLink
VPATH = src include build

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) $(LIBRARIES) -o ./dist/$@

$(OBJECTS): $(SOURCES)
$(CC) $(INC) $(CFLAGS) $< -o $@

这应该采用 *.c 文件并生成具有相同名称的 *.o 文件。但是我在 make 上得到以下输出 -
$ make
gcc -I./include -c src/funcs.c -o build/funcs.o
gcc -I./include -c src/funcs.c -o build/main.o
gcc build/funcs.o build/main.o -L/mingw64/lib -o ./dist/testLink

接下来当然是一堆多重定义错误。正如您从前两行看到的那样,它采用相同的 *.c 文件并将其两次编译为两个不同的 *.o 文件。

我是 makefile 的新手,但我认为我的 $(OBJECTS) 规则有问题,我很确定是 $< 导致了问题。我正在尝试创建一个通用的 makefile,它始终适用于我的具有相同目录结构的项目,并将 .c 文件转换为 .o 文件和链接。我是完全以错误的方式解决这个问题还是对我的 makefile 有一个简单的修复?

谢谢!

詹姆士

最佳答案

这个规则:

$(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 $@

main.o: 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/

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