0

Linux システムで中規模のプロジェクトをコンパイルするには、Makefile の問題があります。私の考えは、Makefile をできるだけシンプルに保ち、Makefile にすべての作業を任せることです。いくつかのソース コード (source/src 内) だけでなく、各ライブラリをテストするためのテスト ファイル (source/test 内) もいくつかあります。Makefile は次のとおりです。

DHOME         = ${HOME}/Project
DSRC          = ${DHOME}/source/src
DINCLUDE      = ${DHOME}/source/include
BIN           = ${DHOME}/target/bin
DirObj        = ${DHOME}/target/obj
DirLib        = ${DHOME}/target/lib

INCLUDES      = -I${DINCLUDE} 
DLIB          = ${DHOME}/target/lib
LIBS          = -L${DLIB} -lm ${DLIB}/dclass.a

CXX           = g++ -g ${INCLUDES} -L${DLIB}
MAKE          = ${CXX} -O -Wall -fPIC -c

TESTS =  test_FCity test_FPlane
o_base  =  DPara.o  DString.o  FCommand.o  FInput.o

${o_base}: %.o: $(DSRC)/%.cc
      $(MAKE) $(CFLAGS) $< -o ${DirObj}/$@ 

dclass: $(o_base)
      ar -rs ${DirLib}/dclass.a ${DirObj}/*.o

TEST_SOURCE = $(wildcard test/test_*.cc)


test: ${o_base} dclass
      ${CXX} ${TEST_SOURCE} -o ${BIN}/$@ ${LIBS}

main: $(SOURCES) $(EXECUTABLE)
      ${CXX} /src/main.c -o ${BIN}/main ${LIBS}

私がやりたいことはmake main、メイン コード ( main.cc) [上記の Makefile でテストされていない] をmake testコンパイルしてリンクし、ディレクトリ内の各ファイルを自動的にコンパイルしてリンクするsource/test(そしてそれらを に入れるtarget/bin) ことです。さて、この Makefile を実行すると、各ライブラリがコンパイルされるように見えますが、次のエラーが発生します。

multiple definition of `main'

すべてmain()関数を持ついくつかのテスト スクリプトをコンパイルしようとしているので、不思議ではありません。この問題を解決する方法と、上記の Makefile を改善する方法はありますか? そして、o_base行で指定されたファイルの量を減らす方法についてのアイデアはありますか?

ありがとうアレックス

4

1 に答える 1

0

あなたの分析は正しいです。テスト ターゲットにすべての .o ファイルをリンクしようとすると、さまざまな実行可能ファイルが 1 つのファイルにまとめられます。

TEST_SOURCE 内の各ファイルに対して結果の実行可能ファイルが必要なため、個別にコンパイラを呼び出す必要があります。これを実現する 1 つの方法は、ルールに (bash) ループを記述して、TEST_SOURCE のすべての要素を反復処理し、それぞれに対してコンパイラを呼び出すことです。

「makefile」-ier アプローチは、依存関係を正しく定義することです。つまり、テストが TEST_SOURCE のターゲットにさらに依存することを定義します (つまり、TEST_EXEC=$(TEST_SOURCE:.o=_exec) のように実行可能ファイルを定義します)、コンパイラを使用します。 TEST_EXEC 生成の規則としての呼び出し。

編集:より詳細:

テストの実行可能ファイルの名前が必要です。変数はおそらくそうではないと思います):

TEST_EXEC = $(TEST_SOURCE:.cc=)

ここで、これらのテスト実行可能ファイルの 1 つをビルドする方法を説明する必要があります。

${TEST_EXEC}: % : %.cc dclass ${o_base}
        ${CXX} $< -o $@               # fit this line to your needs

そして最後に、対象のテストがこれらすべてのテスト実行可能ファイルに依存していることを彼に伝えます。

test: ${TEST_EXEC}
        echo we have nothing to do here, so we just emit "Tests created"
于 2012-09-19T05:56:35.780 に答える