我在堆栈溢出中的第一个问题!
我的问题的快速概述:我使用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编写的内容:
予。的"项目/ 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()中的参数个数。我认为这与错误无关。
II。的项目/ Makefile.am :
SUBDIRS = main lib_foo
III。的项目/主/ 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
IV。的项目/ 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 不应该安装但只能编译,所以我必须使用&#39; noinst _&#39;在lib_foo / Makefile.am中。这就是我被困在这里的原因。
任何答案将不胜感激。 谢谢你的帮助!
答案 0 :(得分:1)
问题在于你正在使用递归automake,在这种情况下,跨越目录路径的依赖关系将无法解析为额外规则:main/Makefile.am
不知道如何在lib_foo
中创建目标。
快速解决方法是将顶级SUBDIRS
中的Makefile.am
声明更改为:
SUBDIRS = lib_foo main
这种方式main/mystery_foo
只能在lib_foo
之后构建并构建其目标。当然,这不允许您只在make
中main/
并让它发挥作用。
上一篇文章中使用non-recursive automake的另一个建议是更合适的解决方案,因为所有依赖关系都可以从单个Makefile.am
解决。
答案 1 :(得分:-1)
你的程序看起来大部分都很好。我刚刚发现了一些可能的错误:
../lib_foo/libfoo.a
更改为libfoo.a
Makefile.am
而不是递归Makefile.am
(递归Makefile.am
可能更难编码并可能会损害性能汇编)