Makefile:从.c文件

时间:2016-01-05 21:15:59

标签: c makefile

我对Makefile没有太多经验,所以答案可能很明显。但是,我无法在GNU make手册或stackoverflow上的其他地方找到我要查找的内容。我已经遇到过这个问题几次了,所以我做了一个示例项目来演示它。

我有目录:

  • src / for .c files
  • 构建/正在构建的库
  • 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

我的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 /目录中的相应文件中编译它们。我该怎么做?

1 个答案:

答案 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 $@