如何在qmake和qt5中使用-isystem(系统头文件)包含Qt的头文件?

时间:2015-05-28 17:44:02

标签: qt g++ warnings qt5 qmake

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

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

编译时,Qt会产生大量警告(1000+只有一个简单的小部件),隐藏了我的代码中的警告。

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

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

注意2:这是一个acknowledged bug,我正在寻找一种解决方法。我使用从源代码5.4.1编译的最新版qmake,此版本从{传递系统头文件{1}}和/include作为系统标题,但不是Qt的标题。

注3:我知道CMake会起作用,但对我来说这不是一个选择。

2 个答案:

答案 0 :(得分:13)

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

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

    $ ./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
    

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

  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“查看”所有Qt标头,但GCC会看到-isystem标志并禁止所有子文件夹的警告。

答案 1 :(得分:2)

您是否在系统路径中安装了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