0

我想设置一个变量 $(CFLAGS2) 来根据我制作的目标保存不同的值。具体来说,我想要一个使用“-g -Wall”编译我的项目的目标,以及另一个使用“-O3”编译的目标

我试过这样:

CC=gcc
COPT=-c $<  -o $@ $(CADD) $(CFLAGS) $(CFLAGS2)

.PHONY: opti
.PHONY: debi

opti: seto
    make hammingtest
debi: setd 
    make hammingtest

.PHONY: seto
seto: 
    $(eval CFLAGS2 := -O3)

.PHONY: setd
setd: 
    $(eval CFLAGS2 :=-g -Wall)

hamming.o: hamming.cpp hamming.h
    $(CC) $(COPT) $(DEFS) $(CFLAGS2)

hammingtest.o: hammingtest.cpp hamming.h
    $(CC) $(COPT) $(DEFS) $(CFLAGS2)

hammingtest: hammingtest.o hamming.o
    $(CC)  -o hammingtest hammingtest.o hamming.o

但是当我执行“make debi”时,它的行为就好像根本没有设置 $(CFLAGS")(与“make opti”相同)我该如何实现呢?

4

1 回答 1

0

不要$(eval ...)在 shell 行中使用。这通常是完全错误的。

有很多方法可以做你想做的事。由于您已经设置了递归 make,您可以使用命令行变量:

opti:
    ${MAKE} COPTS2='-O3' hammingtest

debi:
    ${MAKE} COPTS2='-g -Wall' hammingtest

更好的风格是避免递归 make,可能有利于目标特定变量:

CC=gcc
COPT=-c $<  -o $@ $(CADD) $(CFLAGS) $(CFLAGS2)

CFLAGS2 = $(error Someone tried to deref CFLAGS2!)
opti: CFLAGS2 := -O3
debi: CFLAGS2 := -g -Wall

.PHONY: all
all:
    @echo 'What do you want to make?'

.PHONY: opti debi
opti debi: hammingtest
opti debi: ; @echo $@ Success

.
.
.

这看起来很可能一目了然。

但是,这种设置方式是有问题的。例如,以下 shell 命令序列将为您提供优化的构建,没有警告。

$ make opti
$ make debi
于 2013-04-09T15:32:52.277 回答