Gcc 使用qmake时是否有可能通过includes-isystem传递

Gcc 使用qmake时是否有可能通过includes-isystem传递,gcc,qmake,suppress-warnings,Gcc,Qmake,Suppress Warnings,我使用qmake作为makefile生成器,并希望继续使用它。 此外,我想使用“gcc-Wall-Werror-Wundef-Wextra”来获得健壮的代码。 我在考虑“学究式”的,但那是更远的路。 目前我的主要问题是由库生成的大量警告,如 boost、qt的部分部件等 目前,每当我包含生成警告的标题时,我都会使用pragmas #pragma GCC diagnostic ignored "-Wall" #include <QtGui> ... #i

我使用qmake作为makefile生成器,并希望继续使用它。 此外,我想使用“gcc-Wall-Werror-Wundef-Wextra”来获得健壮的代码。 我在考虑“学究式”的,但那是更远的路。 目前我的主要问题是由库生成的大量警告,如 boost、qt的部分部件等

目前,每当我包含生成警告的标题时,我都会使用pragmas

    #pragma GCC diagnostic ignored "-Wall"
    #include <QtGui>
    ...
    #include <QWidget>
    #pragma GCC diagnostic error "-Wall"
#pragma GCC诊断被忽略“-Wall”
#包括
...
#包括
#pragma GCC诊断错误“-墙”
这一点都不可爱,相当乏味和麻烦,尤其是其他程序员也必须这样做。 是否有一个使用qmake的选项允许将qt库作为系统头包含在内,
从而压制了他们的警告。对于普通makefiles和cmake I know-isystem,我找不到用于此的qmake挂件。

由于许多设置都硬编码到规范文件中,我认为您需要创建自己的。 从阅读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 as中硬编码

#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”)其他地方…

我发现的最简单的方法是通过QMAKE_cxflags直接包含 e、 g.对于Boost,在项目文件中如下所示

QMAKE_CXXFLAGS += -isystem /usr/local/boost_1_44_0

我刚刚在macx clang/qmake.conf中添加了以下内容:


QMAKE_cxflags+=$$join(QMAKE_INCDIR_QT,“-isystem”,“-isystem”)


现在可以很好地工作。

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

这适用于许多库,而不仅仅是Qt,我可以使用它而不会遇到太多问题。但是相比之下,Magic++.h确实是一件可怕的工作,我必须具备这种能力

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


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

将此行添加到.pro文件

system(./suppress_system_warnings.sh)
然后创建一个可执行文件suppress\u system\u 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;

这似乎是一个已知的问题。接受修补程序?更新链接:在Qt 5.4.0中标记为已修复。似乎这是一个已知问题:TomášZato提供了一个在编译时提供此功能而不破坏IDE集成的方法。@毫无意义的是,错误已移动到(仍然打开),如果问题是关于CMake,则可能是正确答案,但既然是关于QMake的,你可能需要检查一下…@boycy,哈!哈说得好!这对qmake毫无帮助。我的错误。
#!/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;