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_'。这就是我被困在这里的原因。
任何答案将不胜感激。
感谢您的帮助!
你的程序看起来基本上完全没问题。我刚刚发现了一些可能的 错误:
- 你的 configure.ac 应该有 LT_INIT 指令
- 在 project/main/Makefile.am 我会把
../lib_foo/libfoo.a
改成 libfoo.a
- 如果前一个不起作用,我建议使用单个
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 中解决=]
我在堆栈溢出中的第一个问题!
快速概述 我的问题:我使用 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_'。这就是我被困在这里的原因。
任何答案将不胜感激。 感谢您的帮助!
你的程序看起来基本上完全没问题。我刚刚发现了一些可能的 错误:
- 你的 configure.ac 应该有 LT_INIT 指令
- 在 project/main/Makefile.am 我会把
../lib_foo/libfoo.a
改成libfoo.a
- 如果前一个不起作用,我建议使用单个
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 中解决=]