8

似たようなタイトルの質問がいくつかあることは知っていますが、必要なものに対する答えを提供するものはないようです(間違っている場合は訂正してください)。

この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回の呼び出しモードではるかにうまく機能するので、それを使用することをお勧めします。

4

2 に答える 2

1

なぜこの効果が必要なのかわかりませんが、これを取得する方法は次のとおりです(GNUMakeで):

SOURCES=file1.cpp file2.cpp file3.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=myprog

all: $(EXECUTABLE)

$(EXECUTABLE): $(SOURCES)
    $(CXX) $(CXXFLAGS) -c $?
    $(CXX) -o $@ $(OBJECTS)

編集:
その解決策が機能することに驚いています.Makeが何をするかについての私の考えには何か問題があります. (これがうまくいかない場合は、他に 1 つまたは 2 つの有効な方法があります。)

SOURCES=file1.cpp file2.cpp file3.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=myprog

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CXX) -o $@ $(OBJECTS)

file1.cpp: file1.h
file2.cpp: file2.h file1.h

$(SOURCES):
    @touch $@

$(OBJECTS): $(SOURCES)
    $(CXX) $(CXXFLAGS) -c $?
    @touch $(OBJECTS)
于 2011-05-18T16:52:27.320 に答える
1

ビルドルールで再構築するファイルを収集し、リンク時に実際にそれらを構築することで、GNUmake にやりたいことをさせることができます。

SOURCES=file1.cpp file2.cpp file3.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=myprog

all: $(EXECUTABLE)

.PHONY: build_list

build_list:
        -rm -f build_list

$(OBJECTS): %.o: %.cpp | build_list
        echo $< >> build_list

$(EXECUTABLE): build_list $(OBJECTS)
        if [ -r build_list ]; then $(CXX) $(CXXFLAGS) -c `cat build_list`; fi
        $(CXX) -o $@ $(OBJECTS)

file1.o: file1.h
file2.o: file2.h file1.h
于 2011-05-18T21:25:09.607 に答える