qt4编译正常,改成qt5后遇到问题
usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -o tmp/obj/main.o main.cpp
In file included from /usr/include/c++/7/bits/stl_algo.h:59:0,
from /usr/include/c++/7/algorithm:62,
from /usr/include/x86_64-linux-gnu/qt5/QtCore/qglobal.h:110,
from /usr/include/x86_64-linux-gnu/qt5/QtGui/qtguiglobal.h:43,
from /usr/include/x86_64-linux-gnu/qt5/QtWidgets/qtwidgetsglobal.h:43,
from /usr/include/x86_64-linux-gnu/qt5/QtWidgets/qapplication.h:43,
from /usr/include/x86_64-linux-gnu/qt5/QtWidgets/QApplication:1,
from main.cpp:1:
/usr/include/c++/7/cstdlib:75:15: fatal error: stdlib.h: 没有那个文件或目录
#include_next <stdlib.h>
^~~~~~~~~~
compilation terminated.
make: *** [Makefile:21224:tmp/obj/main.o] 错误 1
原因:
这是由于gcc7已经吧stdlib.h纳入了libstdc++以进行更好的优化,C Library的头文件stdlib.h使用 Include_next,而include_next对gcc系统头文件路径很敏感
解决方法
1 在.pro文件中添加如下一行:
DEFINES += ENABLE_PRECOMPILED_HEADERS=OFF
生效
2 在.pro文件中添加如下一行:
QMAKE_CFLAGS_ISYSTEM = -I
解决问题
3
在.pro文件中去除如下一行:
INCLUDEPATH +=/usr/include
也可以解决问题
最后,为了兼容qt4\qt5以及交叉编译
使用下面方式。
greaterThan(QT_MAJOR_VERSION, 4): {
QT += widgets
QMAKE_CFLAGS_ISYSTEM = -I
}