一般的なmakeファイルを作成しようとしています。追加するファイルの数とプロジェクトツリーに入れるファイルの数とは関係なくプロジェクトをコンパイルできます。パターンマッチングを使用すると "make"が失敗する
私のステップバイステップアプローチでは、私はこのメイクファイルにうまくいきます。
CC=g++
OBJECTS=main.o board.o
VPATH=src:\
src/board:\
include/board:\
build:\
bin
boardG : main.o board.o
$(CC) -o bin/boardG build/main.o build/board.o
main.o : main.cpp board.hpp
$(CC) -c -I include $< -o build/[email protected]
board.o : board.cpp board.hpp
$(CC) -c -I include $< -o build/[email protected]
このバージョンでは問題なく機能します。以下の出力を参照してください。
[email protected]:~/code/projects/boardG$ make
g++ -c -I include src/main.cpp -o build/main.o
g++ -c -I include src/board/board.cpp -o build/board.o
g++ -o bin/boardG build/main.o build/board.o
ここでの問題は、.cppファイルごとに1つのルールを作成する必要があることです。それはまさに私が避けようとしているものです。したがって、私はこのようなマッチングパターンを使用して、上記のバージョンを適応させることを試みた。その中に
[email protected]:~/code/projects/boardG$ make
g++ -c -o main.o src/main.cpp
src/main.cpp:2:27: fatal error: board/board.hpp: No such file or directory
compilation terminated.
<builtin>: recipe for target 'main.o' failed
make: *** [main.o] Error 1
私のプロジェクトはfollwing構造を有している/ファイル:
CC=g++
OBJECTS=main.o board.o
VPATH=src:\
src/board:\
include/board:\
build:\
bin
boardG : main.o board.o
$(CC) -o bin/boardG build/main.o build/board.o
%.o : %.cpp %.hpp
$(CC) -c -I include $< -o build/[email protected]
私は今、私はfollwing出力を得るmakeを実行し
。./bin/
./build/
./include/board/board.hpp
./src/main.cpp
./src/board/board.cpp
./makefile
パターンマッチングを使用するときにmakeがコマンドを変更するのはなぜでしょうか?あるいは、おそらくもっと正確には、私は何が間違っていて、失敗するのでしょうか?
これはおそらく組み込みの '%.o:%.cpp'ルールを使用しています。ターゲットに一致する'%.hpp'ファイルが見つからないためです。これらのルール( '-r')を無効にすると、違う方法で失敗するはずです。 'make -d'を実行することは、makeがあなたの目標を見つけたときに何をしようとしているのかを示す点で有用かもしれません。 (私はVPATHがどのように単一のターゲットで複数のパターンの前提条件を持っているかわかりません) –
ビルドすることを約束したファイル以外のファイルをビルドするいくつかのルールがあります(例えば 'board.o '')、そしてこのフィクションと一緒に演じる別のルール、ビルドされていないファイルが必要であると主張し、次にそれらのファイルを使用することです。当然これを一般化しようとするとすぐに壊れます。 – Beta