Linux Makefiles输出目录
我是一个使用makefile的初学者,我正在尝试为gcc编写一个makefile,它接受来自两个不同目录的输入,在我的例子中,它们被称为kernel和drivers,并使用通配符将对象文件输出到另一个名为tmp的目录中 我编写了这段代码来获取输入文件和输出文件的名称Linux Makefiles输出目录,linux,gcc,makefile,Linux,Gcc,Makefile,我是一个使用makefile的初学者,我正在尝试为gcc编写一个makefile,它接受来自两个不同目录的输入,在我的例子中,它们被称为kernel和drivers,并使用通配符将对象文件输出到另一个名为tmp的目录中 我编写了这段代码来获取输入文件和输出文件的名称 C_SOURCES = $(wildcard $(KERNEL_DIR)/*.c $(DRIVERS_DIR)/*.c) #Creating a list for object files names C_OBJ = $(C_SO
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 $@
但是我无法将目标文件输出到所需的目录中。类似于此示例的文件应该可以满足您的需要。为了可读性,我对内容进行了一些拆分,但我相信您会明白这一点:
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_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))
注意内核目录和驱动目录中同名的源文件 您必须为每个子目录制定单独的规则,如下所示:
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文件,您会遇到很大的问题…您必须为每个子目录制定单独的规则,如下所示:
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文件,您会遇到很大的问题…我应该如何修改规则?我使用下面的“%.o:%.c$CC$CFLAGS-c$<-o$@@PatrickJane,这是一个更难的。因为您只需要一个输出目录,所以这将很困难。我建议您不要这样做,而是镜像tmp中的输入目录结构-然后您将有一个1:1的映射,将每个.o文件映射到一个.c文件,使您的生活更轻松。我应该如何修改规则?我使用下面的“%.o:%.c$CC$CFLAGS-c$<-o$@@PatrickJane,这是一个更难的。因为您只需要一个输出目录,所以这将很困难。我建议您不要这样做,而是在tmp中镜像输入目录结构-这样您就可以将每个.o文件1:1映射到.c文件,从而使您的生活更轻松。