如何将 Qt 的 headers 与 -isystem (system headers) 包含在 qmake 和 qt5 中?

How to include Qt's headers with -isystem (system headers) with qmake and qt5?

我在 g++ 上启用了警告编译基于 Qt5 的项目:

# project.pro file
QMAKE_CXXFLAGS += -std=c++11 -Wall -Wextra -Wconversion -Weffc++

编译时,Qt 会产生很多警告(仅一个简单的小部件就产生 1000 多个),隐藏了我的代码中的警告。

如何告诉 qmake 在指定 Qt 的 headers 而不是 -I 时使用 -isystem 开关来抑制警告?我不想关闭警告,我想为我的代码保留它们。

注意:我检查了 this SO question 但它在我的情况下不起作用,它可能仅适用于 Qt4,我使用 Qt5。

注意 2:这是一个 acknowledged bug,我正在寻找解决方法。 我使用从源代码 5.4.1 编译的最新版本的 qmake,这个版本从 /include/usr/include 传递系统 headers 作为系统 headers 但不是 Qt 的 headers.

注意 3:我知道 CMake 可以,但这不是我的选择。

您是否将 Qt 安装在 系统 路径中?否则qmake不会通过-isystem.

你可以通过阅读你的mkspec/qconfig.pri(在你运行 configure之后)根据qmake检查哪些路径是系统路径,系统路径设置为QMAKE_DEFAULT_INCDIRS 多变的。这里:

QMAKE_DEFAULT_INCDIRS = /usr/include/c++/4.8 /usr/include/x86_64-linux-gnu/c++/4.8 /usr/include/c++/4.8/backward /usr/lib/gcc/x86_64-linux-gnu/4.8/include /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed /usr/include/x86_64-linux-gnu /usr/include

我找到了两种方法来抑制来自 Qt 的 headers 的警告,一种方法是在系统路径中安装 Qt(如另一个答案中所建议的),另一种方法是直接从 pro 文件中通过使用 GCC 标志。

  1. 构建您自己的 Qt 时,将 header 的安装路径配置为您的系统路径之一:

    $ ./configure -headerdir /usr/local/include
    

    系统路径是 /usr/include/usr/local/include 或以下中列出的其余路径之一:

    $ grep DEFAULT_INCDIRS mkspecs/qconfig.pri
    QMAKE_DEFAULT_INCDIRS = /usr/include/c++/4.8 /usr/include/x86_64-linux-gnu/c++/4.8 /usr/include/c++/4.8/backward /usr/lib/gcc/x86_64-linux-gnu/4.8/include /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed /usr/include/x86_64-linux-gnu /usr/include
    

    来源:this thread 在 Qt 的开发列表中。

  2. 或者直接在您的 Qt pro 文件中,只需将 -isystem 标志添加到 QMAKE_CXXFLAGS:

    # the line below suppresses warnings generated by Qt's header files: we tell
    # GCC to treat Qt's headers as "system headers" with the -isystem flag
    QMAKE_CXXFLAGS += -isystem $$[QT_INSTALL_HEADERS]
    

    生成的 GCC 命令行如下所示:

    g++ -c -pipe -isystem /usr/local/Qt-5.4.1/include -Wall ...
        -I/usr/local/Qt-5.4.1/include
        -I/usr/local/Qt-5.4.1/include/QtWidgets
        ...
    

    注意 Qt 的包含路径如何仍然添加 -I,允许 Qt Creator "see" 所有 Qt headers,但 GCC 看到 -isystem 标志和抑制所有子文件夹的警告。