GNU autotool:No 制定目标的规则

GNU autotool:No rule to make target

我在堆栈溢出中的第一个问题!

快速概述 我的问题:我使用 autotool 生成 C 程序。当我使用 make 命令时,遇到错误:

No rule to make target `../lib_foo/libfoo.a', needed by `mistery_foo'.  Stop.

一些细节 我的问题:

我正在做我老师的作业,其中我应该使用 GNU autotool 生成一个非常简单的 C 程序。

文件结构: /project: main, lib_foo, Makefile.am, configure.ac

/project/main: main.c, main.h, Makefile.am

/project/lib_foo: foo.c, foo.h, Makefile.am

以下是我为configure.ac和makefile.am写的:

我。 "project/configure.ac":

AC_PREREQ([2.67])
AC_INIT([project1],[0.01],[cwentai01@gmail.com])
AM_INIT_AUTOMAKE([1.9 foreign])
AC_CONFIG_SRCDIR([./lib_foo/foo.c])
AC_CONFIG_HEADERS([config.h])
AC_PROG_CC
AC_PROG_RANLIB
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <mistery.h>]],\
                [[ mistery_value(1);]])],\
                [AC_DEFINE([MISTERY_VALUE_ONEPARAM], [],[CONSTANT])],[])
AC_SEARCH_LIBS([mistery_value],[magic vadoo mistery],[],[AC_MSG_ERROR([Libraries (mistery, magic, vadoo) not found])])
AC_CONFIG_FILES([Makefile  lib_foo/Makefile main/Makefile])
AC_OUTPUT 

P.S。 AC_COMPLIE_IFELSE用于判断函数mistery_value()中的参数个数。我认为这与错误无关。

二. project/Makefile.am:

SUBDIRS = main lib_foo 

三。 project/main/Makefile.am

LDADD = ../lib_foo/libfoo.a
mydir = ../uselessbin
my_PROGRAMS = mistery_foo
mistery_foo_SOURCES = main.c main.h
mistery_foo_LDADD = ../lib_foo/libfoo.a

四. project/lib_foo/Makefile.am

noinst_LIBRARIES = libfoo.a
libfoo_a_SOURCES = foo.c foo.h

然后我运行用命令的顺序:

>cd project
> aclocal
> autoheader
> automake -a
> autoconf
> ./configure
> make
> make install
> ./uselessbin/mistery_foo

当我 运行 make 命令时,我收到错误:

No rule to make target `../lib_foo/libfoo.a', needed by `mistery_foo'.  Stop.

我想问题可能是我没有正确安装 libfoo.a。但是库 libfoo.a 不应安装而只能编译,所以我必须在 lib_foo/Makefile.am 中使用 'noinst_'。这就是我被困在这里的原因。

任何答案将不胜感激。 感谢您的帮助!

你的程序看起来基本上完全没问题。我刚刚发现了一些可能的 错误:

  1. 你的 configure.ac 应该有 LT_INIT 指令
  2. 在 project/main/Makefile.am 我会把 ../lib_foo/libfoo.a 改成 libfoo.a
  3. 如果前一个不起作用,我建议使用单个 Makefile.am 而不是递归 Makefile.am(递归 Makefile.am 可能更难编码并且可能会损害性能的汇编)

问题是您正在使用递归自动生成,在这种情况下,跨目录路径的依赖项将不会解析为额外的规则:main/Makefile.am 不知道如何在 [=12= 中创建目标].

快速修复是将 top-level Makefile.am 中的 SUBDIRS 声明更改为:

SUBDIRS = lib_foo main

这样 main/mystery_foo 只会在 lib_foo 及其目标构建之后构建。当然,这不允许您在 main/ 中仅 make 并让它工作。

之前 post 的另一个建议,使用 non-recursive automake 是一个更合适的解决方案,因为这样所有的依赖关系都可以从一个 Makefile.am.[=21 中解决=]