2012-01-27 77 views
0

我试图移植我正在开发autotools的应用程序。我不是编写makefiles的专家,这是我能够使用autotools的必备条件。 特别是,该项目的结构如下: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”的结构。

我已经写在根下面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 

and ../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. 

我已经阅读了自动工具的文档,但我无法找到与我正在工作的类似的例子。不幸的是,我无法改变目录结构,因为这是我正在开发的项目的一个固定必要条件。

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

谢谢。

+0

如果你在某处有tarball或git repo,最好看看。 – 2012-01-27 13:40:34

+0

听起来好像没有src/bar/Makefile。 src/bar/Makefile.in存在吗? – 2012-01-27 19:21:23

+0

AC_PROG_LIBTOOL已过时。改用LT_INIT。另外,使用“configure.ac”而不是“configure.in”。 – 2012-01-27 19:21:55

回答

0

如果它在src/bar中失败,为什么src/bar/Makefile.am是唯一没有发布的代码?你应该使用$(srcdir)或者$(top_srcdir),而不是像“../../”那样引用相对路径(如果人们想要产生二进制文件而不会污染源目录)