Makefile输出目录

时间:2013-04-27 17:24:18

标签: linux gcc makefile

我是一个使用makefile的初学者,我正在尝试为gcc编写一个makefile,它接受来自两个不同目录的输入(在我的例子中,它们被称为内核和驱动程序),并将目标文件输出到另一个目录中(称为tmp)使用通配符。

我已编写此代码以获取输入文件和输出文件的名称

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

但我无法在所需的directory.files

中输出目标文件

2 个答案:

答案 0 :(得分: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中同名的源文件!

答案 1 :(得分: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 $@ $<

$(OBJECT_DIR)/%.o : $(DRIVER_DIR)/%.c
        $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

如果两个源目录中都有foo.c文件,显然你会遇到大问题......