Recursive makefile 没有规则使目标“全部”。停止

Posted

技术标签:

【中文标题】Recursive makefile 没有规则使目标“全部”。停止【英文标题】:Recursive makefile No rule to make target `all'. Stop 【发布时间】:2014-12-21 23:55:04 【问题描述】:

该项目是关于一个包含 src 目录的根目录。我创建了两个 makefile,一个在顶层目录,另一个在 src 目录。这是src目录的makefile:

## Process this file with automake to produce Makefile.in

## Created by Netbeans

AM_CPPFLAGS = \
   -DPACKAGE_LOCALE_DIR=\""$(localedir)"\" \
   -DPACKAGE_SRC_DIR=\""$(srcdir)"\" \
   -DPACKAGE_DATA_DIR=\""$(pkgdatadir)"\"


bin_PROGRAMS = scratchautotool

program_INCLUDE_DIRS := /usr/bin/PR__bin

program_LIBRARY_DIRS := /usr/lib/PR__lib

CFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir))

AM_LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir))

scratchautotool_SOURCES = \
     main.c \
     Task.c \
     SeedVP.c

depend :
    makedepend --$(CFLAGS) --$(scratchautotool_SOURCES)

根目录的makefile如下图:

## Process this file with automake to produce Makefile.in
## Created by Netbeans

   SUBDIRS = src

   scratchautotooldocdir = $prefix/doc/scratchautotool
   scratchautotooldoc_DATA = \
          README\
          COPYING\
          AUTHORS\
          ChangeLog\
          INSTALL\
          NEWS

    INTLTOOL_FILES = intltool-extract.in \
      intltool-merge.in \
      intltool-update.in

    EXTRA_DIST = $(scratchautotooldoc_DATA) \
          $(INTLTOOL_FILES)

    DISTCLEANFILES = intltool-extract \
          intltool-merge \
          intltool-update \
         po/.intltool-merge-cache

   # Remove doc directory on uninstall
   uninstall-local:
   -rm -r $(scratchautotooldocdir)

但是当我从终端调用 make 时,它给了我以下错误:

   Making all in src
   make[2]: Entering directory `../src'
   make[2]: *** No rule to make target `all'.  Stop.
   make[2]: Leaving directory `../src'

【问题讨论】:

--$(scratchautotool_SOURCES) 将扩展到--main.c Task.c SeedVP.c,这很可能不是您想要或想要的。同样,--$(CFLAGS) 将扩展到 ---I/usr/bin/PR__bin(或者可能是 -- -I/usr/bin/PR__bin,我必须对其进行测试才能确定),但在任何一种情况下都不太可能是您想要的。 @Etan 我的源目录包含 3 个文件和两个头文件,我使用 makedepend 自动生成依赖规则并避免任何错误我可以这样做你的意思是这是错误的,关于 cflags,我有一个文件夹,里面有很多main.c、seedvp.c等在代码中用到的头文件 我的意思是在 makedepend 行上使用这些变量几乎肯定是不正确的,因为你有太多的破折号(除非 makedepend 有一些奇怪的参数要求)。只需查看当您运行make depend 时make 指示它正在运行的命令即可了解我的意思。为简单起见,那些foreach 循环也可以替换为CFLAGS += $(addprefix -I,$(program_INCLUDE_DIRS))AM_LDFLAGS += $(addprefix -L,$(program_LIBRARY_DIRS)) 我运行 makedepend 它给了我这个错误 No rule to make target `depend'。停止。 depend 目标很可能只在src 目录中有效。 【参考方案1】:

错误很明显:它期望找到目标all,但没有找到。我假设您在没有指定目标的情况下调用了make;默认是(惊喜!)all

【讨论】:

对不起,如果我的问题似乎是微不足道的,但正如我之前所说,我是初学者;所以你的意思是我应该把 all: 添加到我的 makefile 但添加到哪个文件或者你的意思是什么? @Sara - 是的,只需将 all: 目标添加到您的 Makefile。您可以简单地将已经存在的目标添加到 all 语句中。示例:'all:depend' 它只会成为你的依赖目标。 makefile 中的默认目标是第一个列出的目标。 all 按照惯例用作该目标,但任何目标都可以。这意味着这里的问题是运行make all 并且没有列出这样的目标。运行make 将构建第一个目标。【参考方案2】:

我想与遇到相同问题的任何人分享我的问题的解决方案,我已经修改了makefile,如下所示:

all: scratchautotool
depend :
       makedepend $(CFLAGS) $(scratchautotool_SOURCES)

但这也给出了同样的错误,所以我搜索并发现 makedepend 不存在所以我必须使用以下命令安装 xutils-dev 包(其中包括程序 makedepend):

  sudo apt-get install xutils-dev

但是这个命令只解决了上面提到的问题!但是makefile现在有一个新问题:)

【讨论】:

以上是关于Recursive makefile 没有规则使目标“全部”。停止的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法定义全局 Makefile(隐式)规则?

Makefile没有针对目标的规则

Makefiles 链是一团糟:没有规则来制作目标

gcc makefile错误:“没有规则来制作目标......”

Makefile 中的规则

Makefile总述②