2017-11-16 14 views
0

私はMakefileを初めて使用しています。私は、メイクファイルを以下ました: -Makefileは、.oファイルが他のfloderに置かれてもファイルが変更されなくてもすべてのファイルをコンパイルします。

$ cat Makefile 
VER = Debug 

main: main.o Time.o 
    g++ Object\ Code/main.o Object\ Code/Time.o -o ../$(VER)/main 

main.o: main.cpp 
    g++ -c main.cpp -o Object\ Code/main.o 

Time.o: Time.cpp Time_.h 
    g++ -c Time.cpp -o Object\ Code/Time.o 

clean: 
    rm Object\ Code/*.o 
    rm ../$(VER)/main 

のmakefileは、srcフォルダ内にある

$ ls && pwd 
main.cpp Makefile Object Code Time.cpp Time_.h 
/home/Rahul/Devlopment/WorkSpace/Test C++/src 

オブジェクトコードは、SRCディレクトリです。

$ ls .. 
Debug Release src 

しかし、私はちょうど1つのファイルを変更して、makeを使用してみてくださいwhenver、それはすべてのファイルをコンパイルします: -

$ make 
g++ -c main.cpp -o Object\ Code/main.o 
g++ -c Time.cpp -o Object\ Code/Time.o 
g++ Object\ Code/main.o Object\ Code/Time.o -o ../Debug/main 
$ touch Time 
Time.cpp  Time_.h 
$ touch Time_.h 
$ make 
g++ -c main.cpp -o Object\ Code/main.o 
g++ -c Time.cpp -o Object\ Code/Time.o 
g++ Object\ Code/main.o Object\ Code/Time.o -o ../Debug/main 
$ make 
g++ -c main.cpp -o Object\ Code/main.o 
g++ -c Time.cpp -o Object\ Code/Time.o 
g++ Object\ Code/main.o Object\ Code/Time.o -o ../Debug/main 

は完全にnoobの通り、私は考えています。私を助けてください。

+2

'main'は' Object Code/main.o'などではなく 'main.o'に依存しています。 – Matt

+0

@Neil Butterworthは何を言ったのですか?ペストのようなファイル名のスペースを避けてください。 – Vroomfondel

答えて

3

ファイルmain.oは、Object\ Code/main.oと同じファイルではなく、他のファイルでも同様です。プログラムを開発するときには、ファイル名とディレクトリにスペースを入れないことを強くお勧めします。 makeを別々のディレクトリを使うように設定するのは簡単ではないので、複数のディレクトリを実装する前にmakefileを一つのディレクトリから動かすべきです。

1

ターゲットメイクを作成するときは、レシピがターゲットと同じファイルを作成する必要があります。このようなルール:

main.o: main.cpp 
     <recipe> 

は、ファイルmain.oを構築したいとあなたがファイルmain.cppmain.oが古くなっている場合は、その後、あなたがするこのレシピ<recipe>を実行することができます」、と言ってメイクによって解釈されますそれ"。しかし、レシピはmain.oを作成せず、Object code/main.oをビルドします。 makeは次回にmakeを実行するときにmain.oを作成したいので、存在しません。makeはmakeを再度作成しようとします。

アイテム#1:makefileにスペースを含むパスを使用することはできません。

アイテム2:あなたのルールが期待するものと同じものを構築するためには、常に[email protected]などの自動変数を使用する必要があります。

アイテム#3:

:それはハードコードされたディレクトリ内のオブジェクトファイルにソースコードをコンパイルするために有用ではないですが、その変数のディレクトリに実行可能ファイルを書き込む( $(Ver)のような)

あなたのメイクファイルは次のようになります。

CXX = g++ 
SOURCES = main.cpp Time.cpp 
VER = Debug 

$(VER)/main: $(SOURCES:%.cpp=$(VER)/%.o) 
     $(CXX) -o [email protected] $^ 

$(VER)/%.o : %.cpp 
     $(CXX) -o [email protected] -c $< 

clean: 
     rm -rf $(VER) 

これらのすべての詳細については、The GNU make manualを参照してください。

関連する問題