![](/img/trans.png)
[英]Makefile : Automatically compile all c files, keeping .o files in separate folder
[英]Makefile: compile .o from .c files
我对Makefiles没有太多经验,因此答案可能很明显。 但是,我无法在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 /目录中的相应文件进行编译。 我该怎么做?
OBJECTS=$(wildcard obj/*.o)
为空,因为wildcard
仅返回现有文件。 您应该依赖$(TARGET)
$(SOURCE_OBJECTS)
$(TARGET)
。
处理多个输入源时,可以缩小选择范围 :
# dest files dest pattern source pattern
$(SOURCE_OBJECTS): obj/%.o: src/%.c
$(CC) -o $@ $^ $(CFLAGS)
Makefile中还有其他小错误(或缺点)。 例如,谁创建了目录obj/
? 为此,您可以依赖目录,例如:
obj/%.o: | obj/
obj/:
mkdir -p $@
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.