我使用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吊坠。
答案 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相比之下真的是一件可怕的工作,我必须具备这种能力。
您可以找到有关此问题的更多信息: