【问题标题】:No rule to make target没有制定目标的规则
【发布时间】:2015-05-25 17:54:35
【问题描述】:

我正在尝试遵循本教程: http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/

当我在最后一个 makefile (#5) 时,“make”无法继续,因为(错误提示)No rule to make target "obj/hellomake.o", needed by "hellomake"。这段代码尝试编译源文件并将libs、srcs、objs放入各自的文件夹中。

IDIR =../include
CC=gcc
CFLAGS=-I$(IDIR)

ODIR=obj
LDIR =../lib

LIBS=-lm

_DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ = hellomake.o hellofunc.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))


$(ODIR)/%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

hellomake: $(OBJ)
    gcc -o $@ $^ $(CFLAGS) $(LIBS)

.PHONY: clean

clean:
    rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~  

我已经盯着它看了一个小时了,这不是一段复杂的代码,但我看不出问题所在。我怀疑问题发生在这里:

$(ODIR)/%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

hellomake: $(OBJ)
    gcc -o $@ $^ $(CFLAGS) $(LIBS)

我只是看不出有什么问题。请帮忙。

【问题讨论】:

  • 这意味着你需要一个像hellomake: 这样的目标,有点像obj/hellomake.o:。但是,我想知道为什么您需要所有这些。这是一个更简单的 make 文件的摘录,该文件为 Linux 上的 Informix 4GL 构建嵌入式 gcc 对象。 GENSRC=chkaddr_test.c createICSLogFile.c print_width.c termlp.c lptmp.c \ rpt_view.c unschd.c check_at.c setSchedPerms.c nfilter.c batchpay.c \ GENOBJ=$(GENSRC:c=o) chkaddr_test: chkaddr_test.o chkaddr.o cc -Wall -Wshadow -g -o chkaddr_test chkaddr_test.c chkaddr.c

标签: c makefile gnu-make


【解决方案1】:

他们的剧本很好!只需这样做:

1°) 创建目录“include”和“src”

mkdir 包括; mkdir 源代码

2°) 在“src”中创建一个“obj”文件夹

mkdir 对象

3°) 你的目录树应该是这样的:

$:~/parentDir$ 树 . ├── 包括 │   └── hellomake.h └── 源 ├── hellofunc.c ├── 你好 ├── hellomake.c ├── 生成文件 └── 对象 ├── hellofunc.o └── hellomake.o

4°) 现在只需在 src 目录中使用 make 命令。 :D

【讨论】:

  • 你是我在 Stackoverflow 中认识的最好的人,我很少看到人们试图复制发布的问题......我希望我可以给你投票两次 :) 所以我错过的是我忘了放../include 目录中的 hellomake.h。问题已解决!
  • 哈哈哈。非常感谢你。你让我今天一整天都感觉很好。我很高兴你解决了你的问题:D
  • 也帮了我一把!谢谢。一个问题 clean 的最后一部分是做什么的? *~ core $(INCDIR)/*~
  • 它会删除名称末尾带有“~”的文件。这些是在 gedit 文本编辑器中编辑的文档的自动创建的备份副本。可能还有其他软件可以做到这一点。
【解决方案2】:

如果您没有名为hellomake.c 的源文件,make 不知道如何制作obj/hellomake.o。您还应该自己创建 obj 目录,因为您在 Makefile 中没有执行此操作的命令,但它的缺失不会导致您报告错误。

你可能知道得更清楚,解释可能更微妙:

我怀疑这一行的开头缺少 TAB 字符:

$(CC) -c -o $@ $< $(CFLAGS)

命令由 Makefile 中的 TAB 字符引入,而不是空格。很不幸,但似乎没有人想解决这个问题。

我记得 1984 年在贝尔实验室遇到了 Stuart Feldman:他被介绍为 make 的发明者。我还没来得及说什么,他就立即这样道歉:我知道,对他的 TAB 感到抱歉!

【讨论】:

  • 缺少 TAB 字符会给我“缺少分隔符”错误提示。我在 stackoverflow 的另一篇文章中解决了这个问题。但你说的有一部分是正确的,我没有正确目录中的文件开始。
猜你喜欢
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 2011-09-08
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
相关资源
最近更新 更多