13

Makefile.am最終的なアプリケーション バイナリの構築を担当する があります。

project/src/Makefile.am

ctrnnまた、src ディレクトリには、追加の を含むと呼ばれるサブディレクトリがありMakefile.amます。

project/src/ctrnn/Makefile.am

ここで、トップレベルがサブディレクトリで生成されたオブジェクト ファイルを使用してバイナリをビルドする必要があるという考えで、ctrnn/Makefile.amオブジェクト ファイルのみを生成する必要があります。.oMakefile.amctrnn

これは次のctrnn/Makefile.amとおりです。

SOURCES = network.cpp\
    neuron.cpp

AM_CPPFLAGS=  @CXXFLAGS@

このMakefile.amファイルに基づいて、network.o と neuron.o を完成させたいと思います。私はMakefileAutomakeなどを使用してそれに応じて生成していますが、makeファイルを実行しようとすると、何もせず、次のように表示されます:

make: Nothing to be done for `all'

理由はわかっています。ビルド ターゲットを指定する必要があります。しかしctrnn/Makefile.ambin_PROGRAMS実際のオブジェクト ファイルnetwork.oneuron.o.

(bin_PROGRAMS 名を指定すると、main への未定義の参照が正しく表示されることに注意してください)。

私は何を間違っていますか?

4

3 に答える 3

28

Automake は、これらのオブジェクトを使用する明示的なターゲット (プログラム、ライブラリ) がなければ、オブジェクトを構築できません。理由の 1 つは、コンパイル オプションがターゲットごとに指定されていることです。2 つのターゲット (2 つのバイナリなど) が同じオブジェクトを使用しているが、コンパイル オプションが異なる場合、同じオブジェクトを 2 回コンパイルする必要がある場合があります。

やりたいことを行うには 3 つの方法がありますが、いずれもソース ファイルを何らかのターゲットに結び付ける必要があります。

  1. を使用しないでください。次src/ctrnn/Makefile.amのサブディレクトリ ソース ファイルを参照してくださいsrc/Makefile.am

    bin_PROGRAMS = foo
    foo_SOURCES = main.c crtnn/network.cpp crtnn/neuron.cpp
    
    これはビルドnetwork.oneuron.oれ、 と同じディレクトリにあることに注意してくださいmain.o。サブディレクトリにオブジェクトが必要な場合は、 を使用しますAUTOMAKE_OPTIONS = subdir-objects

  2. 便利なライブラリを使用します。2src/crtnn/Makefile.amつのオブジェクトのライブラリを作成します。

    noinst_LIBRARIES = libcrtnn.a
    libcrtnn_a_SOURCES = network.cpp ニューロン.cpp
    
    src/Makefile.am、実行可能ファイルをライブラリにリンクします。
    bin_PROGRAMS = foo
    foo_SOURCES = main.c
    foo_LDADD = crtnn/libcrtnn.a
    サブディレクトリ = crtnn
    
    インストールされない場合は「便利」と呼ばれます (noinst_接頭辞があるためわかります): ビルド中に使用されるだけです。これはスタティック ライブラリなので、リンク時にandに置き換えcrtnn/libcrtnn.aた場合と同じ結果になります。crtnn/network.ocrtn/neuro.ofoo

  3. Libtool 便利なライブラリを使用します。Libtool をまだ使用していない場合は、さらにセットアップが必要です。呼び出しを追加LT_INITconfigure.acて再実行autoreconfし、libtool ファイルをインストールする必要があります。次に、次のように更新src/crtnn/Makefile.amして、2 つのオブジェクトのライブラリを作成できます。

    noinst_LTLIBRARIES = libcrtnn.la
    libcrtnn_la_SOURCES = network.cpp ニューロン.cpp
    
    そしてsrc/Makefile.am次のように:
    bin_PROGRAMS = foo
    foo_SOURCES = main.c
    foo_LDADD = crtnn/libcrtnn.la
    サブディレクトリ = crtnn
    
    違いはなんですか?あなたは尋ねるかもしれませんが、ほとんどありません。Libtool 便利なライブラリを使用する利点の 1 つは、入れ子にできることです。Libtool ライブラリには、別の Libtool ライブラリを含めることができます (これは、ソース コードの階層が深く、各レベルでライブラリを構築している場合に便利です)。また、必要に応じて、Libtool 便利なライブラリを使用して共有ライブラリを構築することもできます。Automake の静的ライブラリはできません。

于 2010-02-21T11:43:43.107 に答える
2

project/src/Makefile.am でソース ファイルを指定するだけで、ctrnn に Makefile.am を指定する必要はありません。

maude_SOURCES = ctrnn/network.cpp ctrnn/neuron.cpp

または、libtool 便利なライブラリを使用できます。ctrnn/Makefile.am に次のように入力します。

noinst_LTLIBRARIES = libctrnn.la
libctrnn_la_SOURCES = network.cpp ニューロン.cpp

そしてsrc/Makefile.amに、

LDADD = ctrnn/libmylib.la

libtool をまだ使用していない場合は、configure.ac に LT_INIT を追加する必要もあります。

于 2010-02-16T20:53:20.797 に答える