发出文件警告,覆盖目标命令

时间:2012-08-14 18:36:22

标签: makefile warnings

作为makefile的一部分,我想生成目标的调试版或发行版。

在功能上,一切正常,但是,我在运行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'

有了这两个问题:

  1. 任何忽略警告的方法
  2. 我做得对吗?需要做哪些改变?

4 个答案:

答案 0 :(得分:14)

执行此操作的最常用方法之一是将发布对象和调试对象放在单独的子目录中。这样,您就无法获得对象规则的重新定义,因为它们将具有不同的名称。像这样:

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)

答案 1 :(得分:7)

与OP(詹姆斯伦纳德)一样,我想抑制或避免有关覆盖Makefile目标的警告。但是,我的情况和目标是不同的。

我希望Makefile发送到include base.mk,我希望Makefile能够覆盖来自base.mk的目标,而不会发出任何警告消息。我正在使用GNU Make。

GNU Make文档描述了这样做的一种方法:

按如下方式创建Makefile

foo:
        echo 'bar' > foo

%: force
        @$(MAKE) -f base.mk $@
force: ;

来源:https://www.gnu.org/software/make/manual/html_node/Overriding-Makefiles.html

上面的方法有(潜在的严重)缺点,它将调用$(MAKE)的单独实例,这意味着(部分或全部?)变量可能(将?)在父调用和子调用之间不共享制作。

令人高兴的是,我找到了一个更好的解决方案,如下所述:

按如下方式创建base.mk

foo-default:
        echo  'foo-default'

bar-default:
        echo  'bar-default'

%:  %-default
        @  true

按如下方式创建Makefile

include  base.mk

foo:
        echo  'foo  Makefile'

示例输出:

$ make foo
echo  'foo  Makefile'
foo  Makefile

$ make bar
echo  'bar-default'
bar-default

请注意,您需要能够控制base.mk中目标的名称,以便为<target>-default命名。换句话说,您不能使用此方法来扩展任意基本makefile。但是,如果您同时控制base.mkMakefile,则此方法允许您创建一个base.mk,然后对其进行多次自定义。

答案 2 :(得分:1)

为避免多次包含同一文件,可以使用C样式的标头“指令”:

ifeq ($(_MY_MAKEFILE_),)
_MY_MAKEFILE_ := defined

...

endif
  • ifeq只是在说“值是否为空”
  • 可能ifndef可以完成类似的工作,但是我首先开始工作了
  • “已定义”值就是所有不为空的内容

答案 3 :(得分:-1)

我整理了自己的商标,并注释掉了打印警告的部分。奇迹般有效。在第2114行附近制作v4.2,read.c