2017-06-22 6 views
3

私は本当に初心者レベルのmakefileに関する情報を見つけるのに苦労しています。尋ねられたように、hereという質問でさえ、$(CC) $(INC) $< $(CFLAGS) -o $(BIN)[email protected] $(LIBS)のようなわかりにくい記号を使って表示されます。それは私を捨てます。makefileを使って.oと.exeファイルを/ build /ディレクトリに置く方法

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

cpptest: main.o 
    g++ -o cpptest main.o 

main.o: main.cpp 
    g++ -c main.cpp 

clean: 
    rm cpptest main.o 

これは私がメイクファイルで行う方法を知っているの完全な限度です。それは動作しますが、main.oとcpptest.exeファイルをプロジェクトルートに置きます。

main.oファイルとcpptest.exeファイルを/ build /ディレクトリに配置します。しかし、すべてのmain.oとすべてのcpptestの前に./build/を置くと、オブジェクトファイルがプロジェクトルートに表示され、exeファイルがまったく表示されません。

私はWindows上でSublime Text 3を使ってこのことを構築しています。これは価値があります。

+0

https://www.google.com/search?q=makefile+tutorial –

+0

私は最初の4つの結果を見ましたが、ディレクトリを挙げたものは最初に他のものを導入したので、著者は混乱したディレクトリのマクロ名や変数名を取得したように見えました。 –

答えて

5

A次のようにわずかに良い解決策は次のようになります、私はファンキーな物事のカップルをお知らせやってんだけど、私は[OK]を、第一及び第二のターゲットを見てみましょ方法

all: build/cpptest 

.PHONY: all 

build: 
    @echo "building directory [email protected]" 
    mkdir -p [email protected] 

build/cpptest: build/main.o | build 
    @echo building [email protected] 
    g++ -o [email protected] $^ 

build/main.o: main.cpp | build 
    @echo building [email protected] 
    g++ -o [email protected] -c $^ 

clean: 
    @echo cleaning... 
    rm -f build/* 

に沿って説明します:

all: build/cpptest 

.PHONY: all 

allという名前のデフォルトターゲットを作成しました。これはダミーのターゲットです(実際にはallというファイルは作成されません)。all.PHONYの依存関係を設定して、偽のマークを付けました。 (これは基本的に、allという新しいファイルがすでに存在する場合、allルールを無視しないようにmakeに指示します)。 allにはレシピがありません。したがって、依存関係が作成される以外は何も行いません。これは少し畳み込まれているように見えるかもしれませんが、メイクファイルでは標準的な方法です。

第3目標:最初の目標のために

build: 
    @echo "building directory [email protected]" 
    mkdir -p [email protected] 

、構築、これは、作成するディレクトリの名前です。 buildはターゲットであり、依存関係はなく、2つのレシピ・ラインがあります。最初のレシピ行は@で始まります。これは、レシピを実行する前にレシピを印刷しないことを意味します。あなたがこれを持っていなかったらあなたの出力は次のようになります:

echo "building directory build" 
building directory build 

これは醜いです。 @は、それが行の先頭にある場合にのみ行います。後であなたは[email protected]を持っていることに気付くでしょう。これは違う。これは、ターゲットの名前(この場合はbuild)に展開される変数です。後でより複雑なmakefileを単純化するので、この変数を適切なものにするのは良い習慣です。 buildターゲットの2番目のレシピがディレクトリを作成します。

第四ターゲット:

build/cpptest: build/main.o | build 
    @echo building [email protected] 
    g++ -o [email protected] $^ 

これはbuild/cpptestは(すなわち、他の二つが行われるまで、これらの構築を開始していない)build/main.obuildに依存していると言います。 1つの大きいcaviate:の前に|記号に気づく。これにより、注文のみの依存関係になります。つまり、buildディレクトリがすでに存在し、そのタイムスタンプがbuild/cpptestより新しい場合は、build/cpptestが期限切れである(再構築しない)とはみなされません。一方、その他の依存関係は、|シンボルの左側にあります。これは、build/main.oが存在しない場合、またはNEWERがbuild/cpptestより大きい場合、makeはbuild/cpptestを再構築する必要があることをmakeに伝えます。

build|(注文のみの依存関係)が必要な理由は、新しいファイルを追加するたびにディレクトリの日付が更新されるためです。したがって、buildは常にbuild/cpptestより新しいタイムスタンプを持ちます。この種のものは、先進的なmakefileのものの下にありますが、これを行うのは適切な方法なので、私はここに示したいと考えました。

@Felixが指摘したように、注文版はすべてのバージョンのmakeで利用できるわけではありません(GNU makeはサポートしています)。

レシピについては、[email protected]変数と$^変数を使用しました。 $^はすべての非順序依存性を表します(この場合はmain.cpp)。ルールは、ルールが実行される前に展開されます。

これを本当に適切にする(例えば$(objs)などの変数を定義する)ことができます。これにより、メイクファイルは将来も維持しやすくなりますが、うまくいけばよいでしょう。

+0

これは良い答えです。 Makefilesで賢明な方法でディレクトリを扱うことは、実際には複雑です(ディレクトリのタイムスタンプは気にせず、そこに確実に置かなければなりません)。*依存性のみを処理する*は、これを処理する良い方法です。それでも、AFAIRは、makeのすべてのフレーバーで一般的にサポートされているわけではないので、* GNU * makeの推奨事項です。 –

+0

main.oとcpptestは決して作成されないので、これは実際には正しくありません。最初のルールではなく3つ目のルールをビルドすることで修正しました。また、.cppを使用して.oを作成するときは、-oの前に-c引き数が必要です。申し訳ありませんが、これは解決策ではありませんが、私の編集を受け入れることができますか? –

+0

私はそれがそうでなければ非常に有益であったと言う必要があり、それは私が必要とした導入だった。 –

関連する問題