【问题标题】:How to include Qt's headers with -isystem (system headers) with qmake and qt5?如何在 qmake 和 qt5 中包含带有 -isystem 的 Qt 头文件(系统头文件)?
【发布时间】:2015-05-28 17:44:01
【问题描述】:

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

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

编译时,Qt 会产生大量警告(仅一个简单的小部件就会产生 1000 多个警告),从而将警告隐藏在我的代码中。

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

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

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

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

【问题讨论】:

  • “解决方法”是向 qmake 提交一个补丁以增加对此的支持。或者切换到 cmake,我希望这是一个已解决的问题。
  • 我有一个最新版本的 qmake(我将编辑问题以提及这一点)。我尝试使用 CMake:include_directories(SYSTEM dir1 dir2) 这可行,但我需要坚持使用 qmake。谢谢

标签: qt g++ warnings qt5 qmake


【解决方案1】:

我发现了两种方法来抑制来自 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 标志并抑制所有子文件夹的警告。

【讨论】:

  • 不需要$$system -- 只需使用$$[QT_INSTALL_HEADERS] :)
  • 我不知道括号的语法——我只用$$QT_INSTALL_HEADERS 尝试过,但它不起作用,我错过了括号!我会更新答案。谢谢!
  • 方法 2:如果 Qt 中有多个文件夹,则应为每个文件夹添加 -isystem $$[QT_INSTALL_HEADERS]/...:参见 stackoverflow.com/a/20264397
  • 这仅适用于类似 gcc 的编译器。 Visual Studio 的等效开关是/external:I <path>gitlab.kitware.com/cmake/cmake/issues/17904
【解决方案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

【讨论】:

    猜你喜欢
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多