【发布时间】:2019-09-15 10:56:01
【问题描述】:
我必须创建一个 Makefile,它从不同文件夹中的 .c 文件创建单个可执行文件。 .c 文件包括来自任何这些文件夹的头文件。根目录有 3 个子目录 x/y、x/z、a,所有这些子目录都有一些 .c 和 .h 文件。我想从根目录编译程序。 这些子目录的本质是可以随时添加/删除新的 .c 文件,因此不可能在 Makefile 中硬编码它们的名称。
到目前为止,我已经创建了这个 Makefile
CC = gcc
INCLUDES = -Ix/y -Ix/z -Ia -Ilib/include
LIB = -lp -lq -lr
demo: x/y/*_d.o x/z/*_l.o a/*_m.o
$(CC) $^ $(LIB) -Llib -o b/demo.exe
%_d.o:: x/y/%.c
$(CC) $(INCLUDES) -c $<
%_l.o:: x/z/%.c
$(CC) $(INCLUDES) -c $<
%_m.o:: a/%.c
$(CC) $(INCLUDES) -c $<
我需要一个能够自行处理这种情况的解决方案。此外,如果将单个文件添加到这些文件夹之一,则只应构建其依赖项,而不是重新构建所有 .c 文件。 TIA。
【问题讨论】:
-
关于:
INCLUDES = -Ix/y -Ix/z -Ia -Ilib/include根据您的问题,没有lib/include -
强烈建议使用:
SRC := $(wildcard x/y/*.c) $(wildcard x/z/*.c ) $(wildcard x/a/*.c )然后OBJ := $(SRC:.c=.o)然后INC := $(SRC:.c=.h)然后DEP := $(SRC:.c=.d)然后使用gcc生成依赖文件。然后在 makefile 的末尾使用:ifneq "$(MAKECMDGOALS)" "clean"newline-include $(DEP)newlineendif那么编译语句将是:%.o: %.c %.dnewline tab$(CC) $(CFLAGS) -c $< -o $@注意:CFLAGS := -Wall -Wextra -Wconversion -pedantic -std=gnu11 -
通过向gcc prepossess步骤发送一些选项,使用
-MD(或类似的)预处理器将在实际编译源代码之前生成依赖文件