-Weffc++
我在我的 Qt 项目中使用 GCC选项。为了抑制来自 Qt 标头的警告,我添加了 QMAKE_CXXFLAGS += -isystem $(QTDIR)\include
.
但这并不能抑制所有警告,我仍然会收到来自Quuid类的烦人警告,因为$(QTDIR)\include\QtCore\quuid.h
文件包含
..\..\src\corelib\plugin\quuid.h
.
我试图添加
QMAKE_CXXFLAGS += -isystem $(QTDIR)\src
,
QMAKE_CXXFLAGS += -isystem $(QTDIR)\src\corelib\plugin
但它没有帮助。有没有办法来解决这个问题?
问问题
2298 次
2 回答
10
您需要分别抑制每个目录。我的项目中的示例:
QMAKE_CXXFLAGS += -isystem "$$[QT_INSTALL_HEADERS]/qt5" -isystem "$$[QT_INSTALL_HEADERS]/qt5/QtWidgets" \
-isystem "$$[QT_INSTALL_HEADERS]/QtXml" -isystem "/usr/include/qt5/QtGui" \
-isystem "$$[QT_INSTALL_HEADERS]/QtCore"
或者,为您启用的确切 Qt 模块自动执行上述操作:
for (inc, QT) {
QMAKE_CXXFLAGS += -isystem \"$$[QT_INSTALL_HEADERS]/Qt$$system("echo $$inc | sed 's/.*/\u&/'")\"
}
# Still need this separately:
QMAKE_CXXFLAGS += -isystem "$$[QT_INSTALL_HEADERS]/qt5"
于 2013-11-28T11:05:08.197 回答
1
这个线程对我帮助很大,谢谢@dismine,但在某些情况下它对我不起作用,所以我正在粘贴我的解决方案(我不想编辑第一个答案)
我已经对其进行了增强以摆脱sed
命令,因此它是跨平台的,它使用标准 qmake 的替换功能$$split()
、、、$$join()
和。$$upper()
$$take_first()
moduleList
需要局部变量,没有它就无法工作。
以下适用于Qt >=5.15.2
(它当然可以在较低版本上运行,但我没有测试它):
# Treat Qt's headers as system headers
QMAKE_CXXFLAGS += -isystem $$shell_quote($$[QT_INSTALL_HEADERS])
for(module, QT) {
equals(module, "testlib") {
QMAKE_CXXFLAGS += \
-isystem $$shell_quote($$[QT_INSTALL_HEADERS]/QtTest)
} else {
# Capitalize a first letter, result: -isystem .../include/QtCore
moduleList = $$split(module, )
QMAKE_CXXFLAGS += \
-isystem $$shell_quote($$[QT_INSTALL_HEADERS]/Qt$$upper(\
$$take_first(moduleList))$$join(moduleList, ))
}
}
unset(moduleList)
它基于当前使用的 Qt 模块动态生成正确-isystem
的编译器标志,因此您可以将此代码包含在不同的项目/子项目中。
于 2021-09-04T05:45:31.030 回答