2016-09-02 9 views
0

私はProject Eulerソリューションディレクトリ用のMakefileを作成しましたが、変更の欠如にかかわらず、いくつかのソリューションを継続的に再コンパイルする際にいくつか問題があります。また、これらの再コンパイル用に作成された*.oファイルは、オブジェクトファイル用に指定したディレクトリには作成されません。私のMakefileのMakefileは常に特定のファイルをコンパイルします

一般要旨:

CC = g++-5 
CFLAGS = -Wall -c 
LFLAGS = -Wall 
STD = -std=c++14 

all: firsttwenty secondtwenty 

firsttwenty: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 p18 p19 p20 
secondtwenty: p21 p22 p23 p24 p25 

# 
# FIRST TWENTY 
# 
p1: object_files/problem1.o 
    $(CC) $(LFLAGS) object_files/problem1.o -o p1 $(STD) 

object_files/problem1.o: solutions/problem1.cpp 
    $(CC) $(CFLAGS) solutions/problem1.cpp $(STD) 

p2: object_files/problem2.o 
    $(CC) $(LFLAGS) object_files/problem2.o -o p2 $(STD) 

object_files/problem2.o: solutions/problem2.cpp 
    $(CC) $(CFLAGS) solutions/problem2.cpp $(STD) 

p3: object_files/problem3.o 
    $(CC) $(LFLAGS) object_files/problem3.o -o p3 $(STD) 

object_files/problem3.o: solutions/problem3.cpp 
    $(CC) $(CFLAGS) solutions/problem3.cpp $(STD) 

... 

これは、すべてのソリューションのために、このようになります。 私は繰り返しコンソールにmakeを入力すると、私はこの出力を期待する:

make: Nothing to be done for 'all'

は、しかし、私が代わりにこれを毎回取得しています:

g++-5 -Wall -c solutions/problem15.cpp -std=c++14 
g++-5 -Wall -c solutions/problem16.cpp -std=c++14 
g++-5 -Wall -c solutions/problem20.cpp -std=c++14 
g++-5 -Wall -c solutions/problem22.cpp -std=c++14 
g++-5 -Wall -c solutions/problem24.cpp -std=c++14 
g++-5 -Wall -c solutions/problem25.cpp -std=c++14 

代わりにそのオブジェクトファイルを出力したのobject_files/では、 であり、代わりにmakefileと同じディレクトリに置かれます。

次のように私のディレクトリ設定は次のとおりです。

project_euler 
    | 
    |-- downloaded_files 
    |  | 
    |  |-- p022_names.txt 
    |-- headers 
    |  | 
    |  |-- bigint.h 
    |-- object_files 
    |  | 
    |  |-- problem1.o 
    |  |-- problem2.o 
    |  |-- ... (other object files) 
    |-- solutions 
    |  | 
    |  |-- problem1.cpp 
    |  |-- problem2.cpp 
    |  |-- ... (other .cpp files) 
    |-- Makefile 
    |-- p1 
    |-- p2 
    |-- p3 
    |-- ... (other binary outputs) 

だから私は、私は二つの質問があると思い:

1)なぜこれらのランダムなファイルがで彼らの.oファイルを置く/たびに再コンパイルされていますその根?

2)私は各ソリューションのための時間の後に同じ事の時間を記述する必要はありませんので、私は私のMakefileを圧縮することができ、いくつかの方法はありますか?

答えて

4

ライン

$(CC) $(CFLAGS) solutions/problem1.cpp $(STD) 

は、オブジェクトファイル object_files/problem1.oを作成しません。代わりに、が実行されているディレクトリに.oファイルを作成します。その行を次のように変更してください。

$(CC) $(CFLAGS) -o [email protected] solutions/problem1.cpp $(STD) 

他の場所でも同様の変更を加えてください。


.oファイルのジェネリックルールを使用すると、メイクファイルの繰り返し部分を減らすことができます。

object_files/%.o: solutions/%.cpp 
    $(CC) $(CFLAGS) -o [email protected] $(STD) $? 

GNU makeで利用可能な自動変数については、https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.htmlで読むことができます。

+0

これは改造の問題を排除しますが、6個の一見ランダムなオブジェクトファイルは、まだ 'make'が実行されるディレクトリに置かれます。 –

+0

@IanH、おそらく古いファイルであるか、古い形式の特定のオブジェクトファイルのルールがあります。 –

+0

あなたは正しいです。私は彼らが再生されたと仮定しましたが、実際には古いファイルでした。ありがとう!これらの繰り返し線をすべてカップルのルールに統合する方法に関するアイデアはありますか? –

関連する問題