Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Makefiles输出目录_Linux_Gcc_Makefile - Fatal编程技术网

Linux Makefiles输出目录

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

我是一个使用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_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文件,从而使您的生活更轻松。