2016-01-05 101 views
1

我对Makefiles没有太多经验,所以答案可能很明显。但是,我无法在GNU make手册或其他地方找到我在寻找的东西。我已经遇到过几次这个问题,所以我做了一个示例项目来演示它。Makefile:从.c文件编译.o

我有目录:

  • 的src /为.c文件
  • 编译/对图书馆正在修建
  • 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 [email protected] $^ 

obj/%.o: src/%.c 
    $(CC) -o [email protected] $^ $(CFLAGS) 

obj/hash.o: $(HASHSRC) 
    $(CC) -o [email protected] $^ $(CFLAGS) 

规则

obj/%.o: src/%.c 

捕捞量的OBJ /目录下的所有.o文件。但是我只想要捕获SOURCE_OBJECTS中列出的文件,并从src /目录中的相应文件编译它们。我将如何做到这一点?

回答

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 [email protected] $^ $(CFLAGS) 

有在Makefile中的小错误(或不足)。例如。谁创建目录obj/?对于这个你可以depend这样的目录:

obj/%.o: | obj/ 

obj/: 
    mkdir -p [email protected] 
+0

正是我在找的是...感谢您的快速反应! – riverrun