2016-02-03 11 views
5

現在、私はC++の教科書を使って作業しています。ルートディレクトリに、私は指定されたディレクトリのすべてのソースをコンパイルする1つのメイクファイル

make directoryName 

を入力することができますし、それがそのディレクトリ内のすべてのソースをコンパイルするように、私は、この本の演習用に別のフォルダを持ちたい、とルートに単一のmakefileと思いますし、バイナリをルートに出力します。ここで私はこれまで持っているものです。

FLAGS= -Wall -Wextra -Wfloat-equal 
OUT=helloworld.out 

%: $(wildcard [email protected]/*.cpp) 
    g++ [email protected]/$(wildcard *.cpp) -o $(OUT) $(FLAGS) 

をしかし、私はそれを実行しようとすると、私が得るすべては

pc-157-231:Section2$ make helloWorld 
make: `helloWorld' is up to date. 

あるすべてのヘルプ感謝

編集 注意。問題は、私がターゲットファイルを変更していないということではありません。私は

+0

変更のhelloWorldしてから使用します(それはすべてのルールは、コマンドを持っていると予想しているため、エコーがあります)メッセージを表示する理由は何も変わっていませんでした – Grv

+0

私はそれを変更しました、それは問題ではありません –

+0

その理由は、ファイルが最新であるということです。変更があったときだけコンパイルされます。コンパイルされません。 – Grv

答えて

1

あなたの問題は、自動GNUは、[email protected]などの変数が唯一のルールの内の値を持たせることである...でした。 GNU makeのドキュメンテーションから。

[自動変数]には、ルールの前提条件リスト内で直接アクセスすることはできません。一般的な間違いは、前提条件リスト内で[email protected]を使用しようとしています。これは動作しません。それはどちらかの間違いではないのですが(source

Additonally、あなたは、(体にし、前提条件のリストの両方で)自分のルールで$(wildcard ...)機能を必要としません:

ワイルドカードの展開はルールで自動的に行われます。 (source

+0

明確にするために、OPが望んでいることはできません、それはあなたの意味ですか? – kebs

+0

@kebs少なくとも簡単ではありません。 MakefileのGNU make + shellコマンドが非常に複雑なmakeルールを作ることを可能にするので、私は「技術的に不可能」とは言いません。 – kfx

0

私は、これは非常に簡単になり、メイクの交換を書かれているが、あなたがhttps://github.com/dascandy/bobからそれをダウンロードすることができそうでない場合などではない、正式にサポート/非常に実験的なものです。

おそらく、としてこれを書くことができるだろう:中間オブジェクト(大規模なプロジェクトのためのより良いが、小さな演習のため、おそらく役に立たない)で、

FLAGS= -Wall -Wextra -Wfloat-equal  

# Take all cpp files in a folder & compile it to executable with that folder name as name. 
(.*)/.*\.cpp => \1.out 
    g++ -o [email protected] $^ $(FLAGS) 

または代わり

FLAGS= -Wall -Wextra -Wfloat-equal  

# Read as, compile any CPP file to a file with the same root but .o as extension 
(.*)\.cpp => \1.o 
    g++ -c -o [email protected] $^ $(FLAGS) 

# read as, take all objects in a subfolder together and compile into executable with folder name as name. 
(.*)/.*\.o => \1.out 
    g++ -o [email protected] $^ 

ツール自体Boost.Filesystemをインストールする必要があります。あなたはすべての実行可能ファイルをコンパイルし、デフォルトのターゲットを持つようにしたい場合は

、これらの行を追加します。

.*.out => all 
    echo -n 

関連する問題