6

-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
但它没有帮助。有没有办法来解决这个问题?

4

2 回答 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 回答