我对 Makefile 没有太多经验,所以答案可能很明显。但是,我无法在 GNU make 手册或 stackoverflow 的其他地方找到我要找的东西。我遇到过几次这个问题,所以我做了一个示例项目来演示它。
我有目录:
- .c 文件的 src/
- build/用于正在构建的库
- obj/用于所有 .o 文件(一个是从不同项目编译的)
它的样子:
$ 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
我的生成文件:
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/目录中的相应文件编译它们。我该怎么做?
最佳答案
OBJECTS=$(wildcard obj/*.o)
为空,因为 wildcard
只返回现有文件。您应该依赖 $(TARGET)
中的 $(SOURCE_OBJECTS)
。
处理多个输入源时,您可以 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 $@
关于c - Makefile:从 .c 文件编译 .o,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34621364/