如何使用旧版 Qt 启用 C++14? Qmake 与 C++14 不兼容
How to enable C++14 with older Qt? Qmake incompatible with C++14
我有 Qt 5.2.1(使用 gcc 4.8.2 编译)和 gcc 4.9.4 (mingw-w64) 编译器。
C++11 工作正常。总是有,即使使用 4.8.2 编译器。
我需要一些 C++14 特性。我想使用最新的编译器,但对 ABI 变化的担忧让我得到了 4.9.2。 gcc 4.9.2 应该支持 make_unique 和 C++14.
我遇到的问题是我似乎无法在 Qt Creator 中获得 C++14 支持。
尝试添加到 pro 文件...没有成功。
CONFIG += c++14
尝试添加到 pro 文件...没有成功:
QMAKE_CXXFLAGS_CXX14 = -std=c++14
尝试添加到 pro 文件...没有成功:
QMAKE_CXXFLAGS_CXX14 = -std=c++14
QMAKE_CXXFLAGS_GNUCXX14 = -std=c++14
尝试添加到 pro 文件...没有成功:
win32-g++ {
QMAKE_CXXFLAGS_CXX14 = -std=c++14
QMAKE_CXXFLAGS_GNUCXX14 = -std=c++14
}
已尝试 adding/editing 对此 win32-g++ makespec 文件...无效
QMAKE_CXXFLAGS_CXX11 = -std=c++0x
QMAKE_CXXFLAGS_CXX14 = -std=c++14
QMAKE_CXXFLAGS_GNUCXX14 = -std=c++14
已尝试 adding/editing 对此 win32-g++ makespec 文件...无效
QMAKE_CXXFLAGS_CXX14 = -std=c++14
QMAKE_CXXFLAGS_GNUCXX14 = -std=c++14
已尝试 adding/editing 对此 win32-g++ makespec 文件...无效
QMAKE_CXXFLAGS_CXX11 = -std=c++14
QMAKE_CXXFLAGS_CXX14 = -std=c++14
QMAKE_CXXFLAGS_GNUCXX14 = -std=c++14
已尝试 adding/editing 对此 win32-g++ makespec 文件...无效
QMAKE_CXXFLAGS_CXX11 = -std=c++14
我相信 QMake 是问题所在。当然,我不确定。
编辑——添加了更多输入
Pro 文件
#-------------------------------------------------
#
# Project created by QtCreator 2018-02-05T13:02:30
#
#-------------------------------------------------
QMAKE_CXXFLAGS += -std=c++1y
QT += core
QT -= gui
TARGET = test2
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
测试代码
#include <QCoreApplication>
#include <iostream>
#include <memory>
using namespace std;
class A{
public:
A(){cout << "ctorA " << endl;}
~A(){cout << "dtorA " << endl;}
};
class X{
A arr[10];
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
{ unique_ptr<X> upX = make_unique<X>(); }
return a.exec();
}
编译器输出
14:01:39: Running steps for project test2...
14:01:39: Configuration unchanged, skipping qmake step.
14:01:39: Starting: "C:\DTOOLS\QtLib5.2.1-QtCreator3.0.1__T-Win-64b_B-gcc4.8.2-seh-posix-opengl\QtSDK-x86_64\bin\mingw32-make.exe"
C:/DTOOLS/QtLib5.2.1-QtCreator3.0.1__T-Win-64b_B-gcc4.8.2-seh-posix-opengl/QtSDK-x86_64/bin/mingw32-make -f Makefile.Release
mingw32-make[1]: Entering directory 'C:/DEV/test2'
g++ -c -march=nocona -mtune=core2 -pipe -fno-keep-inline-dllexport -std=c++1y -O2 -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_NO_DEBUG -DQT_CORE_LIB -I. -I"..\..\DTOOLS\QtLib5.2.1-QtCreator3.0.1__T-Win-64b_B-gcc4.8.2-seh-posix-opengl\QtSDK-x86_64\include" -I"..\..\DTOOLS\QtLib5.2.1-QtCreator3.0.1__T-Win-64b_B-gcc4.8.2-seh-posix-opengl\QtSDK-x86_64\include\QtCore" -I"release" -I"..\..\DTOOLS\QtLib5.2.1-QtCreator3.0.1__T-Win-64b_B-gcc4.8.2-seh-posix-opengl\QtSDK-x86_64\mkspecs\win32-g++" -o release\main.o main.cpp
main.cpp: In function 'int main(int, char**)':
main.cpp:21:27: error: 'make_unique' was not declared in this scope
{ unique_ptr<X> upX = make_unique<X>(); }
^
main.cpp:21:40: error: expected primary-expression before '>' token
{ unique_ptr<X> upX = make_unique<X>(); }
^
main.cpp:21:42: error: expected primary-expression before ')' token
{ unique_ptr<X> upX = make_unique<X>(); }
^
Makefile.Release:177: recipe for target 'release/main.o' failed
mingw32-make[1]: *** [release/main.o] Error 1
mingw32-make[1]: Leaving directory 'C:/DEV/test2'
Makefile:34: recipe for target 'release' failed
mingw32-make: *** [release] Error 2
14:01:40: The process "C:\DTOOLS\QtLib5.2.1-QtCreator3.0.1__T-Win-64b_B-gcc4.8.2-seh-posix-opengl\QtSDK-x86_64\bin\mingw32-make.exe" exited with code 2.
Error while building/deploying project test2 (kit: QtLib5.2.1_t-Win-64b_B-gcc9.9.4)
When executing step 'Make'
14:01:40: Elapsed time: 00:01.
您使用了错误的变量,以下应该有效并且是 4.9
支持的最高值
QMAKE_CXXFLAGS += -std=c++1y
根据 this schedule of Qt releases we have 5.2 prior to C++14 which was released on December 15, 2014. While GCC 4.8.2 supports some subset of C++14 that is not C++14 compliant compiler yet. Check 关于 GCC 中的 C++ 标准支持。
您很可能需要将 Qt 升级到至少 5.4 才能启用 CONFIG += c++14
配置,并且编译器需要比 GCC 4.8.2 更新,最好至少是 GCC 5+。
尝试使用 -std=gnu++1y
来激活早期 GCC 中的 C++ 14 功能。
我在我的一个项目中使用它。在 .pro
文件中:
CONFIG += c++14
# Qt 5.3 and lower doesn't recognize "c++14". Use c++11 and then replace
# the compiler flags with c++14.
contains(QT_MAJOR_VERSION, 5):lessThan(QT_MINOR_VERSION, 4) {
CONFIG += c++11
QMAKE_CXXFLAGS_CXX11 = $$replace(QMAKE_CXXFLAGS_CXX11, "std=c\+\+11", "std=c++1y")
QMAKE_CXXFLAGS_CXX11 = $$replace(QMAKE_CXXFLAGS_CXX11, "std=c\+\+0x", "std=c++1y")
}
# Qt 4 doesn't even know about C++11, so just add c++14 directly.
contains(QT_MAJOR_VERSION, 4) {
QMAKE_CXXFLAGS += -std=c++1y
}
如果您不关心 Qt4,请删除最后一部分。
显然这只适用于 GCC 和 Clang。其他编译器需要不同的处理方式。
我有 Qt 5.2.1(使用 gcc 4.8.2 编译)和 gcc 4.9.4 (mingw-w64) 编译器。
C++11 工作正常。总是有,即使使用 4.8.2 编译器。
我需要一些 C++14 特性。我想使用最新的编译器,但对 ABI 变化的担忧让我得到了 4.9.2。 gcc 4.9.2 应该支持 make_unique 和 C++14.
我遇到的问题是我似乎无法在 Qt Creator 中获得 C++14 支持。
尝试添加到 pro 文件...没有成功。
CONFIG += c++14
尝试添加到 pro 文件...没有成功:
QMAKE_CXXFLAGS_CXX14 = -std=c++14
尝试添加到 pro 文件...没有成功:
QMAKE_CXXFLAGS_CXX14 = -std=c++14
QMAKE_CXXFLAGS_GNUCXX14 = -std=c++14
尝试添加到 pro 文件...没有成功:
win32-g++ {
QMAKE_CXXFLAGS_CXX14 = -std=c++14
QMAKE_CXXFLAGS_GNUCXX14 = -std=c++14
}
已尝试 adding/editing 对此 win32-g++ makespec 文件...无效
QMAKE_CXXFLAGS_CXX11 = -std=c++0x
QMAKE_CXXFLAGS_CXX14 = -std=c++14
QMAKE_CXXFLAGS_GNUCXX14 = -std=c++14
已尝试 adding/editing 对此 win32-g++ makespec 文件...无效
QMAKE_CXXFLAGS_CXX14 = -std=c++14
QMAKE_CXXFLAGS_GNUCXX14 = -std=c++14
已尝试 adding/editing 对此 win32-g++ makespec 文件...无效
QMAKE_CXXFLAGS_CXX11 = -std=c++14
QMAKE_CXXFLAGS_CXX14 = -std=c++14
QMAKE_CXXFLAGS_GNUCXX14 = -std=c++14
已尝试 adding/editing 对此 win32-g++ makespec 文件...无效
QMAKE_CXXFLAGS_CXX11 = -std=c++14
我相信 QMake 是问题所在。当然,我不确定。
编辑——添加了更多输入
Pro 文件
#-------------------------------------------------
#
# Project created by QtCreator 2018-02-05T13:02:30
#
#-------------------------------------------------
QMAKE_CXXFLAGS += -std=c++1y
QT += core
QT -= gui
TARGET = test2
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
测试代码
#include <QCoreApplication>
#include <iostream>
#include <memory>
using namespace std;
class A{
public:
A(){cout << "ctorA " << endl;}
~A(){cout << "dtorA " << endl;}
};
class X{
A arr[10];
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
{ unique_ptr<X> upX = make_unique<X>(); }
return a.exec();
}
编译器输出
14:01:39: Running steps for project test2...
14:01:39: Configuration unchanged, skipping qmake step.
14:01:39: Starting: "C:\DTOOLS\QtLib5.2.1-QtCreator3.0.1__T-Win-64b_B-gcc4.8.2-seh-posix-opengl\QtSDK-x86_64\bin\mingw32-make.exe"
C:/DTOOLS/QtLib5.2.1-QtCreator3.0.1__T-Win-64b_B-gcc4.8.2-seh-posix-opengl/QtSDK-x86_64/bin/mingw32-make -f Makefile.Release
mingw32-make[1]: Entering directory 'C:/DEV/test2'
g++ -c -march=nocona -mtune=core2 -pipe -fno-keep-inline-dllexport -std=c++1y -O2 -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_NO_DEBUG -DQT_CORE_LIB -I. -I"..\..\DTOOLS\QtLib5.2.1-QtCreator3.0.1__T-Win-64b_B-gcc4.8.2-seh-posix-opengl\QtSDK-x86_64\include" -I"..\..\DTOOLS\QtLib5.2.1-QtCreator3.0.1__T-Win-64b_B-gcc4.8.2-seh-posix-opengl\QtSDK-x86_64\include\QtCore" -I"release" -I"..\..\DTOOLS\QtLib5.2.1-QtCreator3.0.1__T-Win-64b_B-gcc4.8.2-seh-posix-opengl\QtSDK-x86_64\mkspecs\win32-g++" -o release\main.o main.cpp
main.cpp: In function 'int main(int, char**)':
main.cpp:21:27: error: 'make_unique' was not declared in this scope
{ unique_ptr<X> upX = make_unique<X>(); }
^
main.cpp:21:40: error: expected primary-expression before '>' token
{ unique_ptr<X> upX = make_unique<X>(); }
^
main.cpp:21:42: error: expected primary-expression before ')' token
{ unique_ptr<X> upX = make_unique<X>(); }
^
Makefile.Release:177: recipe for target 'release/main.o' failed
mingw32-make[1]: *** [release/main.o] Error 1
mingw32-make[1]: Leaving directory 'C:/DEV/test2'
Makefile:34: recipe for target 'release' failed
mingw32-make: *** [release] Error 2
14:01:40: The process "C:\DTOOLS\QtLib5.2.1-QtCreator3.0.1__T-Win-64b_B-gcc4.8.2-seh-posix-opengl\QtSDK-x86_64\bin\mingw32-make.exe" exited with code 2.
Error while building/deploying project test2 (kit: QtLib5.2.1_t-Win-64b_B-gcc9.9.4)
When executing step 'Make'
14:01:40: Elapsed time: 00:01.
您使用了错误的变量,以下应该有效并且是 4.9
支持的最高值QMAKE_CXXFLAGS += -std=c++1y
根据 this schedule of Qt releases we have 5.2 prior to C++14 which was released on December 15, 2014. While GCC 4.8.2 supports some subset of C++14 that is not C++14 compliant compiler yet. Check 关于 GCC 中的 C++ 标准支持。
您很可能需要将 Qt 升级到至少 5.4 才能启用 CONFIG += c++14
配置,并且编译器需要比 GCC 4.8.2 更新,最好至少是 GCC 5+。
尝试使用 -std=gnu++1y
来激活早期 GCC 中的 C++ 14 功能。
我在我的一个项目中使用它。在 .pro
文件中:
CONFIG += c++14
# Qt 5.3 and lower doesn't recognize "c++14". Use c++11 and then replace
# the compiler flags with c++14.
contains(QT_MAJOR_VERSION, 5):lessThan(QT_MINOR_VERSION, 4) {
CONFIG += c++11
QMAKE_CXXFLAGS_CXX11 = $$replace(QMAKE_CXXFLAGS_CXX11, "std=c\+\+11", "std=c++1y")
QMAKE_CXXFLAGS_CXX11 = $$replace(QMAKE_CXXFLAGS_CXX11, "std=c\+\+0x", "std=c++1y")
}
# Qt 4 doesn't even know about C++11, so just add c++14 directly.
contains(QT_MAJOR_VERSION, 4) {
QMAKE_CXXFLAGS += -std=c++1y
}
如果您不关心 Qt4,请删除最后一部分。
显然这只适用于 GCC 和 Clang。其他编译器需要不同的处理方式。