今天我一直在为这个问题绞尽脑汁。
我在很多目录中有很多c 文件。它们都需要编译并链接到库。
这是文件的假设布局:
main_dir/
thing1/
thing1.c
thing2/
thing2.c
thing3/
thing3.c
MakeFile
我有一个 makefile 可以“查找”这些文件并生成必要的对象,但是,始终使用相同的 c 文件作为输入。
这就是 Makefile 的样子(每个文件的内容都是一个使用 put() 的函数):
C=gcc
CFLAGS=-Wall -g
OBJDIR=obj
SRC=$(shell find src/ -type f -name "*.c")
SRC_DIRS=$(shell find src/ -type f -name "*.c" -exec dirname {} \; | uniq)
OBJS=$(SRC:%.c=${OBJDIR}/%.o)
$(OBJS) : $(SRC)
@echo Compiling : $<
$(C) -c $(CFLAGS) -o $@ $<
clean:
rm -fv $(OBJS) thingy.a
folders:
$(call build_dirs)
all: folders $(OBJS)
ar -r -o thingy.a $(OBJS)
define build_dirs
for dir in $(SRC_DIRS); do \
mkdir -pv $(OBJDIR)/$$dir; \
done
endef
制作的输出:
for dir in src/thing1 src/thing2 src/thing3; do mkdir -pv obj/$dir; done
Compiling : src/thing1/thing1.c
gcc -c -Wall -g -o obj/src/thing1/thing1.o src/thing1/thing1.c
Compiling : src/thing1/thing1.c
gcc -c -Wall -g -o obj/src/thing2/thing2.o src/thing1/thing1.c
Compiling : src/thing1/thing1.c
gcc -c -Wall -g -o obj/src/thing3/thing3.o src/thing1/thing1.c
ar -r -o thingy.a obj/src/thing1/thing1.o obj/src/thing2/thing2.o obj/src/thing3/thing3.o
ar: creating thingy.a
我非常确定问题是我在中使用 $(SRC) $(OBJS) : $(SRC) 但是,我就是不知道该怎么办。
有 MakeFu 可以提供帮助吗?
最佳答案
您的 $(OBJS) 似乎设置正确,因此以下内容应该有效(而不是 $(OBJ) : $(SRC) 目标):
$(OBJDIR)/%.o : %.c
@echo Compiling : $<
$(C) -c $(CFLAGS) -o $@ $<
关于编译包含多个目录的文件列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12627992/