28

メイクファイルの一部として、ターゲットのデバッグ バージョンまたはリリース バージョンを生成したいと考えています。

機能的には、すべてが機能していますが、make を実行すると警告が表示されます

 12 SRC := $(shell echo src/*.cpp)
 13 SRC += $(shell echo $(TEST_ROOT)/*.cpp)
 14 
 15 D_OBJECTS = $(SRC:.cpp=.o)       # same objects will need to be built differently
 16 R_OBJECTS = $(SRC:.cpp=.o)       # same objects will need to be built differently

 22 all: $(TARGET)
 23 
 25 $(TARGET): $(D_OBJECTS)
 26   $(CC) $(D_OBJECTS) -o $(TARGET)
 27 
 28 $(D_OBJECTS) : %.o: %.cpp                     # ----- run with debug flags 
 29   $(CC) $(COMMON_FLAGS) $(DEBUG_FLAGS) -c $< -o $@
 30 
 31 release: $(R_OBJECTS)
 32   $(CC) $(R_OBJECTS) -o $(TARGET)
 33 
 34 $(R_OBJECTS) : %.o: %.cpp                     # ----- run with release flags
 35   $(CC) $(COMMON_FLAGS) $(RELEASE_FLAGS) -c $< -o $@

デバッグmakeバージョンをmake release取得すると、リリース バージョンを取得します。

しかし、警告も表示されます:

Makefile:35: warning: overriding commands for target `src/Timer.o'
Makefile:29: warning: ignoring old commands for target `src/Timer.o'
Makefile:35: warning: overriding commands for target `test/TimerTest.o'
Makefile:29: warning: ignoring old commands for target `test/TimerTest.o'

この2つの質問で:

  1. 警告を無視する方法
  2. 私は正しいことをしていますか?どのような変更が必要ですか?
4

4 に答える 4

16

これを行う最も一般的な方法の 1 つは、リリース オブジェクトとデバッグ オブジェクトを別々のサブディレクトリに置くことです。そうすれば、オブジェクトのルールの再定義を取得できません。名前が異なるためです。このようなもの:

D_OBJECTS=$(SRC:%.cpp=debug/%.o)
R_OBJECTS=$(SRC:%.cpp=release/%.o)

RTARGET = a.out
DTARGET = a.out.debug

all : dirs $(RTARGET)

debug : dirs $(DTARGET)

dirs :
    @mkdir -p debug release

debug/%.o : %.c
    $(CC) $(DEBUG_CFLAGS) -o $@ -c $<

release/%.o : %.c
    $(CC) $(RELEASE_CFLAGS) -o $@ -c $<

$(DTARGET) : $(D_OBJECTS)
    $(CC) $(DEBUG_CFLAGS) -o $@ $(D_OBJECTS)

$(RTARGET) : $(R_OBJECTS)
    $(CC) $(RELEASE_CFLAGS) -o $@ $(R_OBJECTS)
于 2012-08-14T19:11:48.560 に答える
-3

私は自分の作成に準拠し、それらの警告が出力されるセクションをコメントアウトしました。魅力のように機能します。make v4.2、read.c、2114行目あたり

于 2019-07-17T19:58:16.170 に答える