似たようなタイトルの質問がいくつかあることは知っていますが、必要なものに対する答えを提供するものはないようです(間違っている場合は訂正してください)。
このmakefileについて考えてみましょう。
SOURCES=file1.cpp file2.cpp file3.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=myprog
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CXX) -o $@ $(OBJECTS)
file1.o: file1.cpp file1.h
file2.o: file2.cpp file2.h file1.h
file3.o: file3.cpp
.cpp.o:
$(CXX) $(CXXFLAGS) -c -o $@ $<
file1.hを変更すると、以下が実行されます。
g++ -c -o file1.o file1.cpp
g++ -c -o file2.o file2.cpp
g++ -o myprog file1.o file2.o file3.o
私が欲しいのは:
g++ -c file1.cpp file2.cpp
g++ -o myprog file1.o file2.o file3.o
cd
(GCCでオブジェクト出力ディレクトリを指定できないことはわかっていますが、これは使用できます。いくつかのコマンドで回避できるはずです。)
nmakeでは、これはダブルコロン推論規則(いわゆる「バッチモード規則」)を使用して行われます。基本的に、複数のターゲットの推論規則( ".obj.cpp:"など)をグループ化し、ファイルごとに1回ではなく、すべての依存関係に対してコンパイラーを呼び出します。$<
変数は、最初の依存関係ではなく、依存関係のリストを取得します。
現在、並列構築(make -j)を使用していますが、独自の問題があり、VC ++コンパイラーは1回の呼び出しモードではるかにうまく機能するので、それを使用することをお勧めします。