-Weffc++
选项。为了压制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
您需要分别抑制每个目录。我项目的示例:
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"
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"
该线程非常有帮助,谢谢@dismine。但是,它并没有为我解决所有问题,所以我在这里分享我的解决方案。
I增强了它,以消除使用标准QMAKE函数的跨平台使用的命令:
sed
$$split()
,
$$join()
,
$$upper()
。
需要本地变量,没有它就无法工作。 tollowing与
$$take_first()
一起工作(我已经删除了此示例的QT5版本,因为它的生命结束了):
moduleList
它基于当前使用的QT模块动态生成正确的
Qt >=6
或# Mark all Qt headers as system headers
!win32-clang-msvc:!mingw:!unix: \
return()
win32-clang-msvc: \
optionToken = -imsvc
else: \
optionToken = -isystem
# The includes are in C:/msys64/ucrt64/include/qt6/ on MSYS2 with Qt6, so they need to be
# tagged as -isystem.
# This is required on Unix and also Clang-cl with MSVC to avoid warnings from system headers.
QMAKE_CXXFLAGS += $$optionToken $$shell_quote($$[QT_INSTALL_HEADERS]/)
for(module, QT) {
equals(module, "testlib"): \
QMAKE_CXXFLAGS += $$optionToken $$shell_quote($$[QT_INSTALL_HEADERS]/QtTest/)
else {
# Capitalize a first letter, result: -isystem <path>/include/QtCore/
moduleList = $$split(module, )
QMAKE_CXXFLAGS += \
$$optionToken $$shell_quote($$[QT_INSTALL_HEADERS]/Qt$$upper(\
$$take_first(moduleList))$$join(moduleList, )/)
}
}
unset(optionToken)
unset(moduleList)
编译器标志,以便您可以在不同的项目/sub-project中包含此代码。我可以建议创建
-isystem
并使用qmake config选项
-imsvc
.。
原始Tiny_system_headers.prf
源代码来自
tinyorm项目。