【问题标题】:Makefiles output directoryMakefiles 输出目录
【发布时间】:2013-04-27 17:24:18
【问题描述】:

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

【问题讨论】:

    标签: linux gcc makefile


    【解决方案1】:

    像这个例子这样的东西应该可以为你做。为了便于阅读,我将内容拆分了一下,但我相信你会明白的:

    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 中同名的源文件!

    【讨论】:

    • 我应该如何修改规则?我使用以下 '%.o: %.c $(CC) $(CFLAGS) -c $
    • @PatrickJane,这更难。由于您只需要一个输出目录,因此会很困难。我建议您不要这样做,而是在 tmp 中镜像输入目录结构 - 然后您将拥有每个 .o 文件到 .c 文件的 1: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 文件,显然你会遇到很大的问题...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多