使用qmake时是否有可能通过包括via -isystem

时间:2010-11-16 22:05:35

标签: gcc qmake suppress-warnings

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

目前,只要我包含警告生成标题

,我就会使用编译指示
    #pragma GCC diagnostic ignored "-Wall"
    #include <QtGui>
    ...
    #include <QWidget>
    #pragma GCC diagnostic error "-Wall"

这远非可爱,相当乏味和繁琐,特别是其他程序员也必须这样做。 是否有使用qmake的选项允许包含qt-libraries作为系统头, 从而压制他们的警告。对于普通的makefile和cmake我知道 - 系统但我找不到这个qmake吊坠。

5 个答案:

答案 0 :(得分:8)

我找到的最简单的方法是直接通过QMAKE_CXXFLAGS 例如对于Boost,这看起来像项目文件中的以下内容

QMAKE_CXXFLAGS += -isystem /usr/local/boost_1_44_0

答案 1 :(得分:3)

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

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

现在很好用。

答案 2 :(得分: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

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

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

qt include path在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”)在其他地方......

答案 3 :(得分: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;

答案 4 :(得分:-4)

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

include_directories(SYSTEM ${QT_INCLUDES})

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

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

Use -isystem instead of -I with CMake