2017-01-21 15 views
0

私の最初の質問はスタックオーバーフローです!GNU autotool:ターゲットを作るルールがありません

私の質問の:私はautotoolを使ってCプログラムを生成します。私はコマンドを作るを使用すると、私はエラーを満たし:詳細私の質問の

No rule to make target `../lib_foo/libfoo.a', needed by `mistery_foo'. Stop. 

何か:私はGNU autotoolを使うべき

私は私の先生の割り当てをしていますが、非常にシンプルなCプログラムを生成します。

ファイル構造:/プロジェクト:メイン、lib_foo、Makefile.am、configure.ac

/プロジェクト/メイン:main.cの、main.h、Makefile.am

/プロジェクト/ lib_foo:foo.cを、foo.hという、makefile.am

後、私はconfigure.acとmakefile.amのために書かれたものは次のとおりです。

I. "プロジェクト/ configure.ac"

AC_PREREQ([2.67]) 
AC_INIT([project1],[0.01],[[email protected]]) 
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. AC_COMPLIE_IFELSEは関数mistery_value()内のパラメータの数を判断するために使用されます。私はそれがエラーとは関係ないと思う。

II。 プロジェクト/ Makefile.am

SUBDIRS = main lib_foo 

III。メインプロジェクト//

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 Makefile.am

プロジェクト/ 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 

私はコマンドを作るを実行すると、私はエラーを得た:

No rule to make target `../lib_foo/libfoo.a', needed by `mistery_foo'. Stop. 

私はlibfoo.aが正しくインストールされていない可能性があります。しかし、ライブラリlibfoo.aはインストールしないでコンパイルするだけでいいので、lib_foo/Makefile.amで 'noinst_'を使う必要があります。だからこそ私はここにこだわる。

ご回答いただければ幸いです。 ご協力いただきありがとうございます!

答えて

1

問題はあなたが再帰的なautomakeを使用していることです。この場合、ディレクトリパスを越える依存関係は特別なルールには解決しません。はlib_fooでターゲットを作る方法を知らない。

SUBDIRS = lib_foo main 

こうmain/mystery_fooだけlib_foo後に構築され、そのターゲットがビルドされています。

クイックフィックスアップは、トップレベルMakefile.amであなたのSUBDIRS宣言を変更することです。もちろん、これはmakemain/にしても機能しません。

non-recursive automakeを使用する前の投稿からのもう1つの提案はより適切な解決策です。なぜならすべての依存関係を1つのMakefile.amから解決できるからです。

-1

あなたの手順はほとんど完全にうまく見えます。以前にはない場合、私はlibfoo.a

  • ../lib_foo/libfoo.aを変更しますあなたのconfigure.acはMakefile.am /メイン/プロジェクトでLT_INIT命令
  • を持っている必要があり

    1. :私はちょうど可能少数のミスを見つけました仕事は、私がMakefile.amシングルと再帰ないMakefile.amを持つことをお勧めします(再帰Makefile.amがコードに難しくすることができ、コンパイルのパフォーマンスを損傷する可能性があります)
  • +0

    私はなぜ落選したのか分かりますが、フィードバックを残すのは普通の習慣です:) –

    +1

    こんにちはビセンテ、私はこれを解決しました。問題は、プロジェクト/ src/Makefile.amで、 "lib_foo"の前にサブディレクトリ "main"を設定していることです。だからmakeは "main"を "lib_foo"の前で扱います。しかし、問題はsrc/main/main.cです。src/lib_foo/foo.cによって生成される "libfoo.a"を使う必要があります。だから私は "SUBDIRS = lib_foo main"のようにproject/src/Makefile.amを変更して動作します。あなたの助けてくれてありがとう、私はここにダウン投票があるのか​​分からないように、それは私ではない:( –

    関連する問題