当我通常在一个C++
项目上工作时,我做的第一件事就是在我的编译器上设置“将警告视为错误”。
使用时Qt
,会为您qmake
生成,Makefile
并且不会在编译命令中包含此选项。我很确定有一种方法可以将这样的选项(和其他选项)添加到生成的文件中Makefile
,但我无法弄清楚。
我该怎么做?
Qt
我使用with的开源版本g++
作为编译器。
您可以QMAKE_CXXFLAGS
在 pro 文件中使用来指定编译器标志:
QMAKE_CXXFLAGS += -Werror
上述解决方案仅适用于 GCC。对于两个编译器(VS 和 gcc),请使用:
win32-g++ {
QMAKE_CXXFLAGS += -Werror
}
win32-msvc*{
QMAKE_CXXFLAGS += /WX
}
有一个名为 QMake 的变量QMAKE_CXXFLAGS_WARN_ON
,它包含在CXXFLAGS
任何时候CONFIG
contains 中warn_on
。
所以我的项目文件都包含一个common.pri
包含:
CONFIG += warn_on
dirty_build: CONFIG += noopt
!dirty_build: WARNINGS += -Werror
# Turn on warnings, except for code that is Qt-generated
WARNINGS += -Wextra
WARNINGS += -Wunknown-pragmas -Wundef
WARNINGS += -Wold-style-cast
WARNINGS += -Wdisabled-optimization -Wstrict-overflow=4
WARNINGS += -Weffc++ -Wuseless-cast
WARNINGS += -Winit-self -Wpointer-arith
WARNINGS += -Wlogical-op
WARNINGS += -Wunsafe-loop-optimizations -Wno-error=unsafe-loop-optimizations
QMAKE_CXXFLAGS_WARN_ON += $(and $(filter-out moc_% qrc_%, $@),$${WARNINGS})
存在禁用 Qt 生成的元对象和资源文件的filter-out
警告。
我也有
# Override the C and C++ targets to selectively replace -I with -isystem for include paths
QMAKE_RUN_CC = $(CC) -o $obj -c $(CFLAGS) $(subst -I/usr/include,-isystem /usr/include,$(INCPATH)) $src
QMAKE_RUN_CC_IMP = $(CC) -o $@ -c $(CFLAGS) $(subst -I/usr/include,-isystem /usr/include,$(INCPATH)) $<
QMAKE_RUN_CXX = $(CXX) -o $obj -c $(CXXFLAGS) $(subst -I/usr/include,-isystem /usr/include,$(INCPATH)) $src
QMAKE_RUN_CXX_IMP = $(CXX) -o $@ -c $(CXXFLAGS) $(subst -I/usr/include,-isystem /usr/include,$(INCPATH)) $<
这使我能够启用-Weffc++
和其他人,而不会从已安装的头文件中产生大量消息。