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