如何将 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 标志。
构建您自己的 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 的开发列表中。
或者直接在您的 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
标志和抑制所有子文件夹的警告。
我在 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 标志。
构建您自己的 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 的开发列表中。
或者直接在您的 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
标志和抑制所有子文件夹的警告。