2013-04-27 63 views
1

我有点使用makefiles的初学者,我正在尝试为gcc编写一个makefile,它接受来自两个不同目录(在我的情况下称为内核和驱动程序)的输入,并输出目标文件一个使用通配符的不同目录(称为tmp)。Makefiles输出目录

我写了这个代码来获取输入文件的名称和输出文件

C_SOURCES = $(wildcard $(KERNEL_DIR)/*.c $(DRIVERS_DIR)/*.c) 

#Creating a list for object files names 
C_OBJ = $(C_SOURCES:.c=.o) 

,我使用下面的规则

%.o: %.c $(CC) $(CFLAGS) -c $< -o [email protected] 

,但我不能让输出目标文件在所需的目录。文件

回答

2

像这样的例子应该为你做。我分裂了一点东西的可读性,但我敢肯定你会得到的想法:

KERNEL_SOURCES = $(wildcard $(KERNEL_DIR)/*.c) 
DRIVER_SOURCES = $(wildcard $(DRIVER_DIR)/*.c) 

OBJECTS = $(patsubst $(KERNEL_DIR)/%.c,tmp/%.o,$(KERNEL_SOURCES)) 
OBJECTS += $(patsubst $(DRIVER_DIR)/%.c,tmp/%.o,$(DRIVER_SOURCES)) 

当心具有相同名称的源文件都KERNEL_DIRDRIVER_DIR

+0

以及如何我应该修改规则吗? 我用下面的一个 '%的.o:%.c的 \t $(CC)$(CFLAGS)-c $ <-o $ @' – 2013-04-27 17:41:07

+0

@PatrickJane,这是一个困难的。既然你只需要一个输出目录,那就很困难。我建议你不要那样做,而是在'tmp'中镜像输入目录结构 - 然后你将每个'.o'文件映射到一个'.c'文件并使你的生活更轻松。 – 2013-04-27 17:44:48

2

你必须做一个单独的规则对于每个子目录,像这样:

SOURCES := $(wildcard $(KERNEL_DIR)/*.c $(DRIVER_DIR)/*.c) 
OBJECTS := $(patsubst %.c,$(OBJECT_DIR)/%.o,$(notdir $(SOURCES))) 

all: $(OBJECTS) 

$(OBJECT_DIR)/%.o : $(KERNEL_DIR)/%.c 
     $(CC) $(CPPFLAGS) $(CFLAGS) -c -o [email protected] $< 

$(OBJECT_DIR)/%.o : $(DRIVER_DIR)/%.c 
     $(CC) $(CPPFLAGS) $(CFLAGS) -c -o [email protected] $< 

显然你就会有很大的问题,如果你有一个foo.c文件在这两个源目录...