【问题标题】:Error while doing make: mingw32-make: *** No rule to make target执行 make 时出错:mingw32-make: *** No rule to make target
【发布时间】: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) newline endif 那么编译语句将是:%.o: %.c %.d newline tab $(CC) $(CFLAGS) -c $&lt; -o $@ 注意:CFLAGS := -Wall -Wextra -Wconversion -pedantic -std=gnu11
  • 通过向gcc prepossess步骤发送一些选项,使用-MD(或类似的)预处理器将在实际编译源代码之前生成依赖文件

标签: c makefile build mingw32


【解决方案1】:

你大部分时间都在那里。您只需要一个简单的规则即可将 .c 编译成 .o,类似于

.co: $(CC) $(包括) -c $

使用通配符的依赖是可以的。

【讨论】:

    猜你喜欢
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2016-06-07
    • 2016-11-19
    • 2011-05-10
    • 1970-01-01
    相关资源
    最近更新 更多