autotools:没有规则来制作目标

时间:2012-01-27 11:49:26

标签: c++ autotools automake

我正在尝试将我正在开发的应用程序移植到autotools。我不是编写makefile的专家,这是我能够使用autotools的必备条件。 特别是,该项目的结构如下:

..
../src/Main.cpp
../src/foo/
../src/foo/x.cpp
../src/foo/y.cpp
../src/foo/A/k.cpp
../src/foo/A/Makefile.am
../src/foo/Makefile.am
../src/bar/
../src/bar/z.cpp
../src/bar/w.cpp
../src/bar/Makefile.am
../inc/foo/
../inc/bar/
../inc/foo/A
../configure.in
../Makefile.am

项目的根文件夹包含一个“src”文件夹,其中包含程序的主要内容以及包含该程序其他来源的多个子文件夹。项目的根目录还包含一个包含.h文件的“inc”文件夹,这些文件只不过是“src”中类的定义,因此“inc”反映了“src”的结构。

我在root中编写了以下configure.in:

AC_INIT([PNAME], [1.0])
AC_CONFIG_SRCDIR([src/Main.cpp])
AC_CONFIG_HEADER([config.h])

AC_PROG_CXX
AC_PROG_CC
AC_PROG_LIBTOOL

AM_INIT_AUTOMAKE([foreign])
AC_CONFIG_FILES([Makefile 
    src/Makefile 
    src/foo/Makefile 
    src/foo/A/Makefile 
    src/bar/Makefile])
AC_OUTPUT

以下是../ Makefile.am

SUBDIRS = src

然后在../src中包含项目的主要部分:

bin_PROGRAMS = pname
gsi_SOURCES = Main.cpp
AM_CPPFLAGS = -I../../inc/foo\
    -I../../inc/foo/A \
    -I../../inc/bar/ 
pname_LDADD= foo/libfoo.a bar/libbar.a
SUBDIRS = foo bar

并在../ src / foo

noinst_LIBRARIES = libfoo.a
libfoo_a_SOURCES = \
    x.cpp \
    y.cpp

AM_CPPFLAGS = \
    -I../../inc/foo \
    -I../../inc/foo/A \
    -I../../inc/bar

与src / bar类似。

问题是在调用automake和autoconf之后,当调用“make”时,编译失败。特别是,程序进入目录src,然后进入foo并创建libfoo.a,但同样的libbar.a失败,出现以下错误:

Making all in bar
make[3]: Entering directory `/user/Raffo/project/src/bar'
make[3]: *** No rule to make target `all'.  Stop.

我已阅读过autotools文档,但我找不到与我正在处理的类似的示例。不幸的是我无法更改目录结构,因为这是我正在处理的项目的固定必要条件。

我不知道你是否可以帮助我或给我任何提示,但也许你可以猜到错误或给我一个类似结构化例子的链接。

谢谢。

1 个答案:

答案 0 :(得分:0)

如果在src / bar中失败,为什么src / bar / Makefile.am是你没有发布的唯一代码?

和顺便说一下,你应该使用$(srcdir)或$(top_srcdir)而不是引用像“../../”之类的相对路径(如果人们想要生成二进制文件而不是对源目录进行处理,这会派上用场)