1

私のmakefileには次の行が含まれています

 11 SRC := $(shell echo src/*.cpp)
 12 SRC += $(shell echo $(TEST_ROOT)/*.cpp)
 13 
 14 OBJECTS = $(SRC:.cpp=.o)

 22 # [debug] target
 23 $(TARGET): $(OBJECTS)
 24   $(CC) $(OBJECTS) -o $(TARGET)
 25 
 26 # [debug] .o
 27 $(OBJECTS): $(SRC)
 28   $(CC) $(CFLAGS) $(DEBUG_FLAGS) -c $(SRC) $(OBJECTS)

これは失敗します...まあ、次のことは明らかにそれを行う方法ではありません

g++ -pedantic -Wall -Werror -O0 -g -Wno-format -DUSE_MEASURE -c src/Timer.cpp test/TimerTest.cpp src/Timer.o test/TimerTest.o

すべてのソースから.oを生成するには、行#28をどのように変更する必要がありますか?

4

1 に答える 1

2

これでうまくいくはずです:

$(OBJECTS): %.o : %.cpp
    $(CC) $(CFLAGS) $(DEBUG_FLAGS) -c $< $@

このルールは1つのオブジェクトファイルを作成し、Makeは他のルールが必要とするオブジェクトごとに1回それを呼び出します。1回のパスですべてのオブジェクトファイルを作成するルールを作成できますが、それによる利点はありません。

編集:

とするSRCsrc/foo.cpp src/bar.cpp testroot/baz.cpp
そうOBJECTSですsrc/foo.o src/bar.o testroot/baz.o

それぞれに個別のルールを設定できます。

src/foo.o : src/foo.cpp
    ...

src/bar.o : src/bar.cpp
    ...

testroot/baz.o : testroot/baz.cpp
    ...

ただし、これは冗長であり(コマンドが非常に似ているため)、不便です(ターゲットを追加/削除するたびにルールを追加/削除したくないため)。したがって、パターンルールを使用します。

%.o : %.cpp
    ...

これで、Makeがビルドするときにsrc/foo.o、ターゲットがパターン%.oに一致し、ステム(に対応する%)がsrc/fooであり、対応する前提条件がsrc/foo.cpp存在することがわかるため、このルールを使用します。

OBJECTSただし、このルールを使用して構築するターゲットを一覧表示する変数があるため、静的パターンルールに制限できます。これは、ほぼ同じように見えますが、ここで説明する必要のないいくつかの利点があります。

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

さて、その...部分について。このコマンドは、prereq(src/foo.cpp)をスキャンしてターゲット()をビルドするようにコンパイラーに指示するsrc/foo.oため、コマンドでそれらを参照する必要があります。自動変数はそれを助けます。$@はターゲット$<の名前であり、最初の(この場合は唯一の)前提条件の名前です。

$(OBJECTS): %.o : %.cpp
    $(CC) $(CFLAGS) $(DEBUG_FLAGS) -c $< $@
于 2012-08-14T04:04:09.627 に答える