作为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'
有了这两个问题:
答案 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.mk
和Makefile
,则此方法允许您创建一个base.mk
,然后对其进行多次自定义。
答案 2 :(得分:1)
为避免多次包含同一文件,可以使用C样式的标头“指令”:
ifeq ($(_MY_MAKEFILE_),)
_MY_MAKEFILE_ := defined
...
endif
ifeq
只是在说“值是否为空” ifndef
可以完成类似的工作,但是我首先开始工作了答案 3 :(得分:-1)
我整理了自己的商标,并注释掉了打印警告的部分。奇迹般有效。在第2114行附近制作v4.2,read.c