【问题标题】:Makefile error: No rule to make target, needed by 'all'. StopMakefile 错误:没有规则来制作目标,'all' 需要。停止
【发布时间】:2017-09-22 21:14:49
【问题描述】:

我在这个目录下写了一个 Makefile:

    .
├── bin
│   └── obj
├── include
│   ├── globals.h
│   ├── ma.h
│   ├── mb.h
│   ├── mc.h
│   └── md.h
├── Makefile
├── Makefile.save
├── src
│   ├── ma.c
│   ├── main.c
│   ├── mb.c
│   ├── mc.c
│   └── md.c
└── test
    ├── main.c
    └── main.o

我的 Makefile 如下:

CFLAGS := -Wall -g -pedantic --std=c99

objs := bin/obj/ma.o bin/obj/mb.o bin/obj/mc.o bin/obj/md.o bin/obj/main.o

all: $(objs)

%.o: %.c
    gcc -c $< -o $@ $(CFLAGS)

但我无法使用 make 命令执行;程序给了我这个错误:

make: *** No rule to make target 'bin/obj/ma.o', needed by 'all'.  Stop.

有人有想法吗?

【问题讨论】:

  • 您的 c 文件在 src 文件夹中,为什么是 bin ?你可以使用 obj/*

标签: linux gcc makefile


【解决方案1】:

您需要告诉 make 以某种方式将源文件名映射到目标文件。这可能有效:

bin/obj/%.o: src/%.c
    gcc -c $< -o $@ $(CFLAGS)

您必须为 test 子目录单独执行相同的操作。

对于缺少的头文件头,您必须将-Iinclude 添加到命令行(最好在不同的变量中而不是在CFLAGS 中,以便仍然可以从命令行覆盖CFLAGS) .

【讨论】:

  • 我使用了你的代码,但是程序给了我这个错误信息: ma.h: No such file or directory exists #include ^ 编译终止。 Makefile:11:目标“bin/obj/ma.o”的配方失败 make:*** [bin/obj/ma.o] 错误 1
  • @faltumd96 为什么你的代码中有#include &lt;ma.h&gt;
  • 我添加了关于包含文件的评论。
【解决方案2】:

您没有任何 binbin/obj 文件夹...

【讨论】:

  • 我编辑了这个问题。没有区别,当文件夹存在或当我用 make 创建它时
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多