CXXFLAGS没有被追加到makefile中

时间:2019-02-08 14:39:35

标签: makefile gnu-make

我有一个生成文件,我希望它既可以生成发行版本,也可以生成调试版本。当我刚跑步时:

make 

我希望CXXFLAGS是:

-std=c++11 -Isrc/includes -c -Os

当我跑步

make debug

我希望CXXFLAGS成为

-std=c++11 -Isrc/includes -c -g

我正在尝试通过他使用虚假目标并将附加标志附加到CXXFLAGS变量来实现此目的,但是这些附加标志永远不会附加。为什么make debug仍然会产生:

g++ -std=c++11 -Isrc/includes -c  src/file.cpp -o build/obj/file.o

而不是预期的

g++ -std=c++11 -Isrc/includes -c -g src/file.cpp -o build/obj/file.o

何时运行?

makefile的内容:

vpath %.cpp src/macro
vpath %.cpp src/data_types
vpath %.hpp src/includes
vpath %.cpp src

CXX := g++
CXXFLAGS := -std=c++11 -Isrc/includes -c 
LXX = g++
LXXFLAGS := 

BUILDDIR := build
OBJDIR := $(BUILDDIR)/obj

SRCS := $(notdir $(shell find -name '*.cpp'))
OBJS := $(patsubst %.cpp, $(OBJDIR)/%.o, $(SRCS))

all: release aval

aval: builddir $(OBJS) $(SRCS) 
    $(LXX) $(LXXFLAGS) $(OBJS) -o $(BUILDDIR)/aval

$(OBJDIR)/%.o: %.cpp
    $(CXX) $(CXXFLAGS) $^ -o $@

.PHONY: release
release: CXXFLAGS += -Os
release: LXXFLAGS += -s -Os

.PHONY: debug
debug:  clean db aval

.PHONY: db
db: CXXFLAGS += -g 


.PHONY: builddir
builddir:
    @mkdir -p $(OBJDIR)

.PHONY: clean
clean:
    @rm -f -r build/obj/*.o
    @rm -f build/avalanche

2 个答案:

答案 0 :(得分:2)

您正在执行的操作的问题是您正在编辑规则的依赖项列表中的CXXFLAGS,由于生成文件的解析方式而导致该规则不起作用。

另一种方法-确实很容易,并且可以使您递归地调用make-我认为这不是特别有害的方法,但是有些方法可以。我发现这种方式肯定不那么复杂。

admin@osboxes:~/sandbox/flags$ make
    CXXFLAGS = defaults
admin@osboxes:~/sandbox/flags$ make release
    CXXFLAGS = defaults release
admin@osboxes:~/sandbox/flags$ make debug
    CXXFLAGS = defaults debug

因此,我们在这里查看命令目标并“解析它们”以查找您的选项并添加到标志中。

我们还需要用于调试和发布的规则来调用构建规则(我现在将其称为{{1}})。

以下是输出:

{{1}}

答案 1 :(得分:1)

您选择的方法无效,因为

db: CXXFLAGS += -g

表示变量CXXFLAGS已更新为目标-g包含db,但没有其他目标。即这种变化并不像您预期​​的那样是全球性的。


以下将是一种实现您所期望的方式:

.PHONY: all release
# NOTE: must be first goal in Makefile to be default goal
all release:
    $(MAKE) -f $(lastword $(MAKEFILE_LIST)) BUILD_CXXFLAGS="-Os" BUILD_LXXFLAGS="-s -Os" build

.PHONY: debug
debug:
    $(MAKE) -f $(lastword $(MAKEFILE_LIST)) BUILD_CXXFLAGS="-g" BUILD_LXXFLAGS="-g" build

.PHONY: build
build: clean aval

CXX := g++
CXXFLAGS := $(BUILD_CXXFLAGS) -std=c++11 -Isrc/includes -c 
LXX = g++
LXXFLAGS := $(BUILD_LXXFLAGS)

# ... and the rest of your original Makefile ...

通过将build实现为虚拟回显,我从上面获得了以下输出:

$ make -s
CXX '-Os -std=c++11 -Isrc/includes -c' LXX '-s -Os'

$ make -s all
CXX '-Os -std=c++11 -Isrc/includes -c' LXX '-s -Os'

$ make -s release
CXX '-Os -std=c++11 -Isrc/includes -c' LXX '-s -Os'

$ make -s debug
CXX '-g -std=c++11 -Isrc/includes -c' LXX '-g'

顺便说一句:您还需要向-g中添加LXXFLAGS,否则将无法获得调试二进制文件。