2011-01-29 18 views
0

これは私の最初の試みです。必要があれば、Makefileはprevious postです。初心者GNU Makefileエラー

は、とにかくここに、独自のオブジェクトファイルを形成するために、私はSelectionSort.cpp & SelectionSort.hフォームオブジェクトファイルを持っているつもりコード

SortLab.exe : SelectionSort.o Main.o 
     g++ -o [email protected] $^ 
SelectionSort.o : SelectionSort.cpp SelectionSort.h 
Main.o : Main.cpp 

#------------------------------------------------------------- 

run: SortLab.exe 
     ./SortLab.exe 

clean: 
    rm -f *.o 
    rm -f *.exe 

build: clean SortLab.exe 

%.o: %.cpp 
    g++ -c $< 

、およびMain.cppです。最後に、実行可能ファイルを作成します。 Main.cppSelectionSort.cppに依存していますが、どこが間違っていますか?

またどこ私はあなたが%.o: %.cppを自分でルールを定義する必要はありません-o-cと、このような

+3

どうして間違っていますか? – Job

+0

私は前のコメントを2番目に挙げましたが、最初にチェックするのは、すべてのインデントされたものに空白がないタブ文字があるかどうかです。これはおそらく、特に初心者のために、Makefilesで最も一般的なエラーです。 –

+0

あるソースモジュールが別のソースモジュールに依存しているとは思えません。オブジェクトファイルをヘッダーに依存させたいと思うかもしれません。また、オプションはGCCマニュアル(http://gcc.gnu.org)にあります。 –

答えて

2
  1. 、異なるGNUコマンドが何を意味するかを見つけることができ、C++をコンパイルする方法を知っていることを確認します。
  2. スペースではなくタブでインデントします。 makeはその違いに敏感です。
  3. すべてのオブジェクトファイルは、それが依存するソースファイルに含まれるヘッダーに依存する必要があります。おそらくMain.o : Main.cpp SelectionSort.hが必要です。
  4. buildは、cleanに依存してはならず、Makeの主な機能(ファイルが変更されたときに選択的に再コンパイル)のいずれかを無効にします。
  5. buildを最初のターゲットにすると、完全なコンパイルを得るためにターゲットなしでMakeを実行できます。メインターゲットallを呼び出すのが通例です。
+0

Point 3. Main.cppがSelectionSort.cppに依存している場合、SelectionSort.hが含まれていますが、 "Main.o:Main.cpp SelectionSort.h"という行が必要ですか? – Malaken

+0

@Malaken @上記のように、あるソースファイルは別のファイルに依存することはできません(#include "SelectionSort.cpp"のようなものがない限り)。 @larsmans、デフォルトのターゲットは最初のものです、どのように名前が付けられていないか、または間違っていますか? –

+0

@Malaken:モジュールは決して互いに依存するべきではありません。 MakeのYに対するXの依存性は、Xをコンパイルするためには、最初にYをコンパイルする必要があります。モジュールはヘッダのみに依存させます。 –