2016-11-12 11 views
1

私はいくつかの変更を加えてバイナリに適用するまで、この単純なmakefileを書きました。それから、私は「きれいにする」と「作る」ことをやる必要があります。ファイルは再構築されません。これまでの単純な作業のように思えますが、私はobjを作るためにこれを修正しませんでした。ファイルを暗黙的に再構築します(ソースを変更するときには 'make'だけを書くことができます)。このシンプルなメークファイルはなぜ変更時にソースを再構築しないのですか?

COMPILER=g++-5.3 
CXXFLAGS=-std=c++11 -O2 -pedantic 

build : a.o 
    $(COMPILER) a.o -o a 

a.o: 
    $(COMPILER) $(CXXFLAGS) -c a.cpp -o a.o 

clean : 
    rm -f *.o *~ a 

編集:私はOmadaによって提案された変更を試してみました(私はこの質問を書いた前に、私は同じ自分自身を試してみました)、これが結果です:

[email protected]: ~/mypath$ cat a.cpp 
#include <iostream> 
int main(int argc, char* argv[]) 
{ 
    if (argc!=2){ 
     std::ceaaarr<<"Prrogram expects 1 argument\n"; 
     return 1; 
    } 
    return 0; 
}[email protected]: ~/mypath$ make 
g++-5.3 a.o -o a 
[email protected]: ~/mypath$ cat Makefile 
#init 

COMPILER=g++-5.3 
CXXFLAGS=-std=c++11 -O2 -pedantic 

build: a.o 
     $(COMPILER) a.o -o a 

a.o: a.cpp 
     $(COMPILER) $(CXXFLAGS) -c a.cpp -o a.o 

clean: 
     rm -f *.o *~ a 
+0

'' a.cpp'に依存する必要がありa.o':

はあなたのレシピが実際にあなたが構築しようとしているターゲットの名前を作成することを確認する必要があります。ですから 'a.o:a.cpp'を読むために' a.o: 'の行を変更してください。ターゲット 'build'を' a.o'ではなく 'a'に依存するように変更し、リンクを行うターゲット' a:a.o'を追加します。 – Peter

答えて

4

ちょうどこの

a.o: 
    $(COMPILER) $(CXXFLAGS) -c a.cpp -o a.o 

を変更この

a.o: a.cpp 
    $(COMPILER) $(CXXFLAGS) -c a.cpp -o a.o 

あなたはa.oa.cppに依存していることをメイクファイルに伝えたことがないので、a.cppが変更されたときにはa.oを再構築する必要があると判断することはできません。

私はそれが動作しない場合、私は私のmakefile上で少し錆びていることを教えてください。

+0

Nope。私はa.cppで構文エラーを作りました。そして、「make」と書いたときに、これが起こります: 'g ++ - 5.3 a.o -o a'。これは、以下のように多くの時間を要します。私はx86_64-redhat-linux-gnu用に構築されたGNU make 3.81を使用しています。 – Smarty77

1

makeに何をすべきかを伝えると、あなたの言うことができます。 a.oをビルドし、前提条件がリストされていないターゲットを持つルールを書く場合、makeはターゲットに前提条件がないと考えます。その場合、ターゲット(a.o)が存在する場合、makeは最新のものとみなします。 Omadaは、前提条件を追加することでそれを避ける方法を教えてくれます。独自のルールを定義する代わりに、.cppファイル(ただし、COMPILERではない変数CXXを使用)からオブジェクトファイルを作成する方法をすでに知っているmakeの組み込みルールを使用することもできます。同様に

、あなたがbuildという名前のファイルが存在し、a.oが、それよりも新しい場合場合buildという名前のターゲットをビルドするためには、それは見るべきことを確認伝えるルールbuild: a.oを、定義した場合。ファイルbuildが存在しない場合は、指定したレシピが実行されます。

レシピ$(COMPILER) $(CXXFLAGS) a.o -o aは実際にはbuildという名前のファイルを作成しないため、常に古くて常に実行されます。

a: a.o 
     $(COMPILER) a.o -o a 
関連する問題