10

我使用 qmake 作为 makefile 构建器,并希望坚持下去。此外,我想使用“gcc -Wall -Werror -Wundef -Wextra”来获得健壮的代码。我正在考虑“-pedantic”,但那是更进一步的道路。我目前的主要问题是诸如 boost、qt 的部分等库产生的大量警告。

目前,每当我包含生成警告的标头时,我都会使用编译指示

    #pragma GCC diagnostic ignored "-Wall"
    #include <QtGui>
    ...
    #include <QWidget>
    #pragma GCC diagnostic error "-Wall"

这远非可爱,而是乏味和麻烦,尤其是其他程序员也必须这样做。是否有使用 qmake 的选项允许将 qt-libraries 包含为系统头文件,从而抑制它们的警告。对于普通的 makefile 和 cmake,我知道 -isystem 但我找不到 qmake 挂件。

4

5 回答 5

11

我发现的最简单的方法是直接通过 QMAKE_CXXFLAGS 包含,例如对于 Boost,这在项目文件中如下所示

QMAKE_CXXFLAGS += -isystem /usr/local/boost_1_44_0
于 2011-06-22T09:26:53.577 回答
3

我刚刚将它添加到我的 macx-clang/qmake.conf 中:

QMAKE_CXXFLAGS += $$join(QMAKE_INCDIR_QT, " -isystem", "-isystem")

现在工作得很好。

于 2013-05-02T13:45:57.040 回答
1

由于许多设置被硬编码到规范文件中,我认为您需要创建自己的设置。从阅读 mkspecs/linux-g++/qmake.conf 或 mkspecs/win32-g++/qmake.conf 开始

您将看到默认情况下 CONFIG 使用 warn_on 设置。在 mkspecs/common/g++ 你有

QMAKE_CFLAGS_WARN_ON    += -Wall -W
QMAKE_CFLAGS_WARN_OFF   += -w
QMAKE_CXXFLAGS_WARN_ON  += $$QMAKE_CFLAGS_WARN_ON
QMAKE_CXXFLAGS_WARN_OFF += $$QMAKE_CFLAGS_WARN_OFF

因此您可以更改规范文件并为每个项目设置新设置,或者您可以在项目文件中设置此变量。

CONFIG += warn_on
QMAKE_CFLAGS_WARN_ON    = -Wall -Werror -Wundef -Wextra -pedantic
QMAKE_CXXFLAGS_WARN_ON  = $$QMAKE_CFLAGS_WARN_ON

qt 包含路径在 mkspecs/features/qt.prf 中硬编码为

#handle includes
INCLUDEPATH = $$QMAKE_INCDIR_QT $$INCLUDEPATH #prepending prevents us from picking up "stale" includes

您不希望 QMAKE_INCDIR_QT 成为 INCLUDEPATH 的一部分,因为它的组件与 -I 相连。您想将其扩展为 $$join(QMAKE_INCDIR_QT, " -isystem", "-isystem") 其他地方...

于 2011-04-28T17:11:06.967 回答
0

想出了一个解决方法:手动更改 Makefile。

将此行添加到 .pro 文件

system(./suppress_system_warnings.sh)

然后创建一个可执行文件suppress_system_warnings.sh

#!/bin/bash
run_in_background() {
    pidof qmake > /dev/null
    while [ $? -eq 0 ]
    do
        sleep 0.2
        pidof qmake > /dev/null
    done

    file=Makefile
    new_line=$( grep ^INCPATH $file | sed 's:-I\/:-isystem\/:g' | sed  's:-I\$:-isystem\$:' )
    line_num=$( grep -n ^INCPATH $file | cut -d':' -f1 )

    head -n $(expr $line_num - 1) $file > __tmp
    echo $new_line >> __tmp
    tail -n +$(expr $line_num + 1) $file >> __tmp

    mv __tmp $file
    exit 0; 
}

run_in_background &
exit 0;
于 2015-09-07T00:02:19.773 回答
-4

请注意,对此的正确答案是在 include_target() 宏中使用 SYSTEM 关键字:

include_directories(SYSTEM ${QT_INCLUDES})

这适用于许多库,而不仅仅是我可以毫无问题地使用的 Qt。但相比之下,Magic++.h 确实是一件糟糕的工作,我必须具备这种能力。

您可以找到有关此问题的更多信息:

在 CMake 中使用 -isystem 而不是 -I

于 2014-05-31T00:18:08.883 回答