1

我在使用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 中输出目标文件

4

2 回答 2

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_DIR注意和中具有相同名称的源文件DRIVER_DIR

于 2013-04-27T17:36:06.623 回答
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在两个源目录中都有一个文件,您将遇到大问题......

于 2013-04-27T19:51:23.910 回答