如何包括Qt';带-isystem(系统头)的s头,带qmake和qt5?

如何包括Qt';带-isystem(系统头)的s头,带qmake和qt5?,qt,g++,warnings,qt5,qmake,Qt,G++,Warnings,Qt5,Qmake,我编译了基于Qt5的项目,并在g++上启用了警告: # project.pro file QMAKE_CXXFLAGS += -std=c++11 -Wall -Wextra -Wconversion -Weffc++ 编译时,Qt会产生大量警告(1000+只需一个简单的小部件),从而对代码隐藏警告 当指定Qt头而不是-I时,如何告诉qmake使用-issystem开关来抑制警告?我不想关闭警告,我想为我的代码保留它们 注意:我检查了,但它在我的情况下不起作用,它可能只适用于Qt4,我使用Qt

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

# project.pro file
QMAKE_CXXFLAGS += -std=c++11 -Wall -Wextra -Wconversion -Weffc++
编译时,Qt会产生大量警告(1000+只需一个简单的小部件),从而对代码隐藏警告

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

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

注2:这是一个问题,我正在寻找解决办法。我使用源代码5.4.1编译的qmake的最新版本,该版本将
/include
/usr/include
中的系统头作为系统头传递,但不传递Qt头


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

您是否在系统路径中安装了Qt?否则qmake将无法通过
-isystem

通过读取
mkspec/qconfig.pri
(运行
configure
后),可以根据qmake检查哪些路径是系统路径,系统路径设置为
qmake\u DEFAULT\u 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头的警告,一种是通过在系统路径中安装Qt(如另一个答案中所建议的),另一种是通过使用GCC标志直接从
pro
文件

  • 构建自己的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的devel列表中

  • 或者直接在Qt
    pro
    文件中,只需将
    -isystem
    标志添加到
    QMAKE\u cxflags

    # 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创建者“查看”所有Qt头,但GCC会看到
    -isystem
    标志并抑制所有子文件夹的警告


  • “解决方法”是向qmake提交一个补丁,该补丁增加了对这方面的支持。或者切换到cmake,我希望这是一个已解决的问题。我有一个qmake的最新版本(我将编辑问题以提及这一点)。我试过使用CMake:
    include_目录(SYSTEM dir1 dir2)
    这很有效,但我需要坚持使用qmake。感谢您无需使用
    $$system
    ——只需使用
    $[QT\u安装头]
    :)我不知道括号语法——我尝试了使用
    $$QT\u安装头
    ,但它不起作用,我缺少括号!我会更新答案。谢谢方法2:如果您在Qt中有多个文件夹,那么应该为每个文件夹添加
    -isystem$$[Qt\u INSTALL\u HEADERS]/…
    :请参阅,这仅适用于类似gcc的编译器。Visual Studio的等效开关是
    /external:I