获取编译器警告摘要

时间:2019-03-27 14:47:43

标签: makefile g++ warnings compiler-warnings

有没有一种方法可以在构建结束时获得所有编译器警告的摘要?在Makefile上使用g ++

1 个答案:

答案 0 :(得分:1)

您可以创建自己的make命令进行编译,并在配方中使用它。例如,您可以将编译器的标准输出和错误输出自动记录到文本文件中,并grep将它们全部输出,以在构建结束时发出警告。类似于(使用GNU make):

# $(1): source file
# $(2): object file
# $(3): log file
MYCXX = $(CXX) $(CXXFLAGS) -c $(1) -o $(2) 2>&1 | tee $(3)

CXXFLAGS += -Wall -pedantic

%.o: %.cpp
    $(call MYCXX,$<,$@,$*.log)

OBJS := $(patsubst %.cpp,%.o,$(wildcard *.cpp))
LOGS := $(patsubst %.o,%.log,$(OBJS))

top: $(OBJS)
    $(CXX) $(LDFLAGS) $^ -o $@
    @printf '\nSummary of warnings\n###################\n\n'
    @for l in $(LOGS); do grep -i -10 warning $$l || true; done

演示:

$ make
g++ -Wall -pedantic -c b.cpp -o b.o 2>&1 | tee b.log
g++ -Wall -pedantic -c c.cpp -o c.o 2>&1 | tee c.log
g++ -Wall -pedantic -c a.cpp -o a.o 2>&1 | tee a.log
g++ -Wall -pedantic -c d.cpp -o d.o 2>&1 | tee d.log
c.cpp: In function ‘int c()’:
c.cpp:1:18: warning: unused variable ‘vc’ [-Wunused-variable]
 int c(void) {int vc; return 0;}
                  ^~
a.cpp: In function ‘int a()’:
a.cpp:1:18: warning: unused variable ‘va’ [-Wunused-variable]
 int a(void) {int va; return 0;}
                  ^~
b.cpp: In function ‘int b()’:
b.cpp:1:18: warning: unused variable ‘vb’ [-Wunused-variable]
 int b(void) {int vb; return 0;}
                  ^~
g++  b.o c.o a.o d.o -o top

Summary of warnings
###################

b.cpp: In function ‘int b()’:
b.cpp:1:18: warning: unused variable ‘vb’ [-Wunused-variable]
 int b(void) {int vb; return 0;}
                  ^~
c.cpp: In function ‘int c()’:
c.cpp:1:18: warning: unused variable ‘vc’ [-Wunused-variable]
 int c(void) {int vc; return 0;}
                  ^~
a.cpp: In function ‘int a()’:
a.cpp:1:18: warning: unused variable ‘va’ [-Wunused-variable]
 int a(void) {int va; return 0;}
                  ^~

甚至还有一种更为优雅的方法,包括(重新)定义CXX标准make变量,并为其分配一个可以完成此工作的小型Shell脚本,以便您可以使用CXX像通常那样:

CXX = function mycxx { g++ $$* 2>&1 | tee $(patsubst %.o,%.log,$@) ;}; mycxx

%.o: %.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

当按foo.o目标的品牌进行扩展时,配方将变为:

function mycxx { g++ $* 2>&1 | tee foo.log ;}; mycxx -Wall -pedantic foo.cpp -o foo.o

然后外壳将最终执行:

g++ -Wall -pedantic foo.cpp -o foo.o 2>&1 | tee foo.log

最终结果应该与第一个解决方案相同,但对Makefile的修改要少得多。除了CXX的(重新)定义之外,它应该保持不变(假设您在食谱中使用CXX,建议这样做)。