1

私のmakefileは、更新があったかどうかをチェックせず、複数のソースファイルが追加されている場合はコンパイルするだけです.1つのソースファイルだけでうまく動作します.

最初のファイルとしてリストされていないソース ファイルは、常に再コンパイルおよびリンクされるようです。

SOURCES=myclass.cpp mylock.cpp
EXECUTABLE=locktest
LIBRARIES=-pthread
CFLAGS=-Wall
CXX=g++
DIR=host/
EXE=$(EXECUTABLE)

OBJECTS=$(SOURCES:%.cpp=$(DIR)%.o)

$(EXE): $(OBJECTS)
    $(CXX) -o $@ $(OBJECTS) $(LIBRARIES)

$(DIR)%.o: %.cpp $(DIR)
    $(CXX) $(CFLAGS) -c $< -o $@ 

$(DIR):
    @mkdir $(DIR)

clean: 
    @rm $(OBJECTS) $(EXE)
    @rmdir $(DIR)

出力は問題を示しています:

stud@pc:~/Desktop/Locktest$ make
g++ -Wall -c myclass.cpp -o host/myclass.o 
g++ -Wall -c mylock.cpp -o host/mylock.o 
g++ -o locktest host/myclass.o host/mylock.o -pthread
stud@pc:~/Desktop/Locktest$ make
g++ -Wall -c myclass.cpp -o host/myclass.o 
g++ -o locktest host/myclass.o host/mylock.o -pthread
4

2 に答える 2

1

@lijat が指摘しているように、でオブジェクトをビルドする$(DIR)と、オペレーティング システムはディレクトリの変更時刻を更新するため、このルールでは次のようになります。

$(DIR)%.o: %.cpp $(DIR)
    ...

前提条件$(DIR)は、最後にビルドされたターゲットを除くどのターゲットよりも常に新しいように見えます。

$(DIR)Make のバージョンが十分に新しい場合は、注文のみの前提条件を作成することで、これを乗り越えることができます。

$(DIR)%.o: %.cpp | $(DIR)
    ...
于 2013-09-28T23:06:24.680 に答える