我是一个使用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
中输出目标文件答案 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_DIR
和DRIVER_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
文件,显然你会遇到大问题......