2012-01-27 102 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),而不是像「../../」那樣引用相對路徑(如果人們想要產生二進制文件而不會污染源目錄)

相關問題