2010-11-16 26 views
9

我使用qmake作为生成文件生成器并希望遵守它。 此外,我想用“gcc -Wall -Werror -Wundef -Wextra”来获得健壮的代码。 我正在考虑“剽窃”,但这是更进一步的道路。 我目前的主要问题是图书馆产生的大量警告,如 提升,qt的部分等。当使用qmake时,是否有可能通过-isystem传递包含

在我使用的编译指示每当我包括警告产生头

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

这远远可爱,相当繁琐和麻烦特别是作为其他程序员也这样做的时刻。 有没有使用qmake的选项,允许将qt-libraries作为系统头文件包含在内,从而禁止其警告。对于普通的makefiles和cmake我唠叨 - 系统,但我找不到一个qmake挂件。

+0

看起来这是一个已知问题的https://bugreports.qt- project.org/browse/QTBUG-7220。修补程序接受? – nonsensickle 2014-01-29 22:23:52

回答

8

我找到的最简单方法是直接通过QMAKE_CXXFLAGS 为加速这看起来像在

QMAKE_CXXFLAGS += -isystem /usr/local/boost_1_44_0 
+0

似乎这是一个已知的问题:https://bugreports.qt-project.org/browse/QTBUG-7220 – nonsensickle 2014-01-29 22:24:19

+0

TomášZato提供了一个[聪明的QtCreator条件实现这个](http://stackoverflow.com/a/34928648/527489),它可以在不破坏IDE集成的情况下进行编译。 – sage 2016-04-09 04:36:00

1

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

您会看到CONFIG默认使用warn_on设置。在mkspecs /普通/ 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 /功能/ 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

我只是说这个我MACX-铛/ qmake.conf项目文件中的以下内容:

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

作品起到了很好了。

-4

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

include_directories(SYSTEM ${QT_INCLUDES}) 

这适用于许多图书馆,而不仅仅是Qt的,我可以没有太多的问题使用。但MagiC++。h相比之下真的是一件可怕的工作,我不得不拥有这种能力。

你可以找到关于这个问题的更多信息:

Use -isystem instead of -I with CMake

+0

这可能是正确的答案,如果问题是关于CMake,但因为它是关于QMake你可能需要检查... – boycy 2014-06-24 15:05:18

+0

@boycy,哈!哈!好点子!这肯定对qmake没有帮助。我的错。 – 2014-06-25 02:47:13

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; 
相关问题