从 gcc 6 切换到 gcc 8 时,Qt 项目停止编译,并出现以下错误:
In file included from /usr/include/qt4/QtCore/qstring.h:46,
from /usr/include/qt4/QtCore/QString:1,
from ../common/strings.h:11,
from /usr/include/string.h:431,
from /usr/include/qt4/QtCore/qlist.h:60,
from /usr/include/qt4/QtCore/qhash.h:48,
from /usr/include/qt4/QtCore/qdebug.h:46,
from /usr/include/qt4/QtCore/QtDebug:1,
from src/main.h:26,
from ../common/main.cpp:9:
/usr/include/qt4/QtCore/qbytearray.h:531:13: note: previous declaration ‘bool operator==(const char*, const QByteArray&)’
inline bool operator==(const char *a1, const QByteArray &a2)
出现此类错误的原因是项目
../common/strings.h
中的遗留头文件包含在系统头文件中
/usr/include/string.h
。在 .pro 文件中,包含路径像这样列出并且没有更改。
INCLUDEPATH += . \
../common
在这两种情况下,
/usr/include/string.h
都包含#include <strings.h>
。为什么使用旧版本的 GCC 时问题没有出现?
标头
strings.h
现在是系统接口的一部分:https://man7.org/linux/man-pages/man0/strings.h.0p.html
问题实际上是操作系统本身较新,而不是 GCC。在与系统名称匹配的标头位置无意中使用已弃用的
-I
会导致灾难。