我对Makefile没有太多经验,所以答案可能很明显。但是,我无法在GNU make手册或stackoverflow上的其他地方找到我要查找的内容。我已经遇到过这个问题几次了,所以我做了一个示例项目来演示它。
我有目录:
它看起来像什么:
$ ls -l
total 0
drwxrwxr-x+ 1 sam None 0 Jan 5 15:43 build
drwxrwxr-x+ 1 sam None 0 Jan 5 15:43 obj
drwxrwxr-x+ 1 sam None 0 Jan 5 15:42 src
我的Makefile:
CC=gcc
CFLAGS=-Wall
SOURCES=$(wildcard src/*.c)
SOURCE_OBJECTS=$(patsubst src/%.c,obj/%.o,$(SOURCES))
OBJECTS=$(wildcard obj/*.o)
HASHSRC=/cbib/libhash/src/hash.c
TARGET=target.a
all: $(TARGET)
$(TARGET): $(OBJECTS)
ar rcs $@ $^
obj/%.o: src/%.c
$(CC) -o $@ $^ $(CFLAGS)
obj/hash.o: $(HASHSRC)
$(CC) -o $@ $^ $(CFLAGS)
规则
obj/%.o: src/%.c
捕获obj /目录中的所有.o文件。但是我只希望它捕获SOURCE_OBJECTS中列出的文件,并从src /目录中的相应文件中编译它们。我该怎么做?
答案 0 :(得分:0)
OBJECTS=$(wildcard obj/*.o)
为空,因为wildcard
仅返回现有文件。您应该依赖$(SOURCE_OBJECTS)
中的$(TARGET)
。
处理多个输入源时,您可以narrow down the selection:
# dest files dest pattern source pattern
$(SOURCE_OBJECTS): obj/%.o: src/%.c
$(CC) -o $@ $^ $(CFLAGS)
Makefile中还有一些小错误(或缺点)。例如。谁创建目录obj/
?为此,您可以在目录上depend,如:
obj/%.o: | obj/
obj/:
mkdir -p $@