首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用较老的Qt启用C++14?Qmake与C++14不兼容

如何使用较老的Qt启用C++14?Qmake与C++14不兼容
EN

Stack Overflow用户
提问于 2018-02-05 03:30:52
回答 3查看 1.1K关注 0票数 2

我有QT5.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。

我的问题是,我似乎无法在中获得C++14支持。

尝试添加到pro file...did不起作用。

代码语言:javascript
复制
CONFIG += c++14 

尝试添加到pro file...did不起作用:

代码语言:javascript
复制
QMAKE_CXXFLAGS_CXX14 = -std=c++14

尝试添加到pro file...did不起作用:

代码语言:javascript
复制
QMAKE_CXXFLAGS_CXX14 = -std=c++14
QMAKE_CXXFLAGS_GNUCXX14 = -std=c++14

尝试添加到pro file...did不起作用:

代码语言:javascript
复制
win32-g++ {
   QMAKE_CXXFLAGS_CXX14 = -std=c++14
   QMAKE_CXXFLAGS_GNUCXX14 = -std=c++14
}

尝试添加/编辑这个win32-g++ makespec文件.不管用

代码语言:javascript
复制
QMAKE_CXXFLAGS_CXX11 = -std=c++0x
QMAKE_CXXFLAGS_CXX14 = -std=c++14
QMAKE_CXXFLAGS_GNUCXX14 = -std=c++14

尝试添加/编辑这个win32-g++ makespec文件.不管用

代码语言:javascript
复制
QMAKE_CXXFLAGS_CXX14 = -std=c++14
QMAKE_CXXFLAGS_GNUCXX14 = -std=c++14

尝试添加/编辑这个win32-g++ makespec文件.不管用

代码语言:javascript
复制
QMAKE_CXXFLAGS_CXX11 = -std=c++14
QMAKE_CXXFLAGS_CXX14 = -std=c++14
QMAKE_CXXFLAGS_GNUCXX14 = -std=c++14

尝试添加/编辑这个win32-g++ makespec文件.不管用

代码语言:javascript
复制
QMAKE_CXXFLAGS_CXX11 = -std=c++14

我相信QMake是问题所在。当然,我不确定。

编辑--添加了更多的输入

Pro文件

代码语言:javascript
复制
#-------------------------------------------------
#
# 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

测试代码

代码语言:javascript
复制
#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();
}

编译器输出

代码语言:javascript
复制
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.
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-05 20:15:44

我在我的一个项目中用到了这个。在.pro文件中:

代码语言:javascript
复制
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。其他编译器需要不同的处理。

票数 1
EN

Stack Overflow用户

发布于 2018-02-05 05:56:29

如果使用了错误的变量,下面的内容应该可以工作,并且是4.9支持的最高值

代码语言:javascript
复制
QMAKE_CXXFLAGS += -std=c++1y
票数 1
EN

Stack Overflow用户

发布于 2018-02-05 05:57:01

根据Qt发布的时间表,我们在2014年12月15日发布的C++14之前有5.2。GCC 4.8.2支持C++14的某些子集,这还不是C++14兼容的编译器。GCC的检查 on C++标准支持。

很可能您需要将Qt升级到至少5.4以启用CONFIG += c++14配置,而且编译器也需要比GCC更新4.8.2,至少最好是GCC 5+。

尝试一下-std=gnu++1y,它的目标是激活GCC早期的C++ 14功能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48615504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档