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

Jul*_*n-L 11 qt warnings qmake g++ qt5

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

# project.pro file
QMAKE_CXXFLAGS += -std=c++11 -Wall -Wextra -Wconversion -Weffc++
Run Code Online (Sandbox Code Playgroud)

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

如何-isystem在指定Qt的标题时告诉qmake使用开关而不是-I抑制警告?我不想关闭警告我想保留它们用于我的代码.

注意:我检查了这个问题,但它在我的情况下不起作用,它可能只适用于Qt4,我使用Qt5.

注2:这是一个公认的错误,我正在寻找一种解决方法.我使用来源5.4.1编译QMAKE的最新版本,该版本从通过系统头文件/include/usr/include作为系统头但不是Qt的头.

注3:我知道CMake可以工作,但这对我来说不是一个选择.

Jul*_*n-L 13

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

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

    $ ./configure -headerdir /usr/local/include
    
    Run Code Online (Sandbox Code Playgroud)

    系统路径是/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
    
    Run Code Online (Sandbox Code Playgroud)

    来源: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]
    
    Run Code Online (Sandbox Code Playgroud)

    生成的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
        ...
    
    Run Code Online (Sandbox Code Playgroud)

    注意Qt的包含路径是如何添加的-I,允许Qt Creator"看到"所有Qt头,但GCC看到该-isystem标志并禁止所有子文件夹的警告.

  • 方法2:如果Qt中有多个文件夹,则应为每个文件夹添加`-isystem $$ [QT_INSTALL_HEADERS]/...`:请参阅http://stackoverflow.com/a/20264397 (3认同)