Как включить С++ 14 со старым Qt? Qmake несовместим с С++ 14

У меня есть компилятор Qt 5.2.1 (скомпилированный с помощью gcc 4.8.2) и gcc 4.9.4 (mingw-w64).

С++11 работает нормально. Всегда, даже с компилятором 4.8.2.

Мне нужны некоторые функции С++ 14. Я хотел бы использовать новейший компилятор, но беспокойство по поводу изменений ABI заставило меня получить 4.9.2. gcc 4.9.2 предположительно поддерживает make_unique и C++14.

У меня проблема в том, что я не могу получить поддержку С++ 14 в Qt Creator.

Пробовал добавлять в 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
}

Пробовал добавлять/редактировать файл makepec win32-g++... не получилось

QMAKE_CXXFLAGS_CXX11 = -std=c++0x
QMAKE_CXXFLAGS_CXX14 = -std=c++14
QMAKE_CXXFLAGS_GNUCXX14 = -std=c++14

Пробовал добавлять/редактировать файл makepec win32-g++... не получилось

QMAKE_CXXFLAGS_CXX14 = -std=c++14
QMAKE_CXXFLAGS_GNUCXX14 = -std=c++14

Пробовал добавлять/редактировать файл makepec win32-g++... не получилось

QMAKE_CXXFLAGS_CXX11 = -std=c++14
QMAKE_CXXFLAGS_CXX14 = -std=c++14
QMAKE_CXXFLAGS_GNUCXX14 = -std=c++14

Пробовал добавлять/редактировать файл makepec win32-g++... не получилось

QMAKE_CXXFLAGS_CXX11 = -std=c++14

Я считаю, что проблема в QMake. Конечно, я не уверен.

РЕДАКТИРОВАНИЕ -- ДОБАВЛЕНО ДОПОЛНИТЕЛЬНО

Профайл

#-------------------------------------------------
#
# 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.

person code    schedule 05.02.2018    source источник
comment
Вероятно, вам следует обновиться до последних версий. Онлайн-установщик делает обновления очень простыми.   -  person Nikos C.    schedule 06.02.2018


Ответы (3)


Я использую это в одном из своих проектов. В файле .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. Другим компиляторам потребуется другая обработка.

person Nikos C.    schedule 05.02.2018
comment
Никос, где мне внести эти изменения. В какие файлы я должен поместить блок contains? Это впечатляющая информация. Как вы пришли к этому знанию? :) - person code; 06.02.2018
comment
@code Вы помещаете это в свой файл проекта после начальных записей. Вот как это выглядит у меня: github.com/realnc/qtads/blob/master /qtads.pro. Что касается того, как я знаю это, я не уверен. Я использую Qt с 2002 года или около того, что, я думаю, означает, что я разбираюсь в этом :-) - person Nikos C.; 06.02.2018
comment
Спасибо, Никос. Я все еще пытаюсь решить эту проблему. Оказывается, существуют глубокие проблемы с тем, как работают Qt и QtCreator. Графический интерфейс Qt Creator подразумевает, что вы можете создавать наборы, сочетающие diff-сборки Qt с diff-компиляторами (очевидно, есть ограничения... Я просто пытался повторно подключить библиотеку QT, созданную с помощью gcc 4.8.2, с более новым компилятором GCC 4.9.3. ...совместимость с ABI). Но это не так. Он не может этого сделать. Возможно, более новые QT Creators могут... но мое тестирование показывает, что Creator 3.0.1 либо глючит, либо непродуманно. Библиотеки Qt упакованы с помощью бинов, библиотек и заголовков GCC... что делает его... - person code; 07.02.2018
comment
невозможно повторно объединить с другой версией компилятора. Вы можете попытаться сделать это через графический интерфейс Creator, но он просто игнорирует компилятор, на который вы указываете, и по умолчанию использует gcc, связанный с его файлами. Я даже пытался вручную перезаписать прилагаемые к нему файлы gcc, но это все равно не работает. В пути sys ничего нет. Это беспорядок. Это не должно быть так сложно. Схема упаковки Qt выглядит как беспорядок с файлами компилятора, разбросанными по всей древовидной иерархии. Не очень plug-n-play. Возможно, они улучшили это в более новых версиях. - person code; 07.02.2018
comment
@code Я бы предложил полностью удалить ваш текущий Creator и Qt, удалить все остатки, а также удалить файлы конфигурации в ваших данных приложения, а затем загрузить онлайн-установщик, который будет держать вас в курсе с помощью простых обновлений до новых версий. Для меня это звучит так, как будто вы используете устаревшие версии и, кроме того, у вас беспорядок в конфигурации. - person Nikos C.; 07.02.2018
comment
проблема с онлайн-установщиком заключается в том, что компиляторы, отличные от VS, устарели (большое время), а gcc только 32-битный. 32bit в 2018 году неприемлемо. Пришлось бы перекомпилировать Qt и десяток зависимостей. Чего я и пытался избежать из-за ограничений по времени. - person code; 08.02.2018

Вы используете неправильные переменные, следующее должно работать и является максимальным, поддерживаемым 4.9

QMAKE_CXXFLAGS += -std=c++1y
person Eelke    schedule 05.02.2018
comment
Не могли бы вы уточнить. Что именно я должен поставить где. Я поместил QMAKE_CXXFLAGS += -std=c++1y в файл PRO, и это не сработало. - person code; 05.02.2018
comment
Он лает на make_unique... говоря, что он не является членом std. - person code; 05.02.2018
comment
Код работает, если вынуть строки QT и скомпилировать в командной строке с помощью g++. - person code; 05.02.2018
comment
Вы запускали qmake после изменения файла pro и перед сборкой кода? В QT Creator есть опция запуска qmake в меню сборки, и вы должны сделать это вручную, это не сделает это за вас. - person Eelke; 05.02.2018
comment
В целом порядок вещей в файле pro не имеет большого значения, но я предпочитаю размещать такие флаги в самом начале файла. - person Eelke; 05.02.2018
comment
Я поставил это первым делом в файле pro. Я устал запускать qmake. Я попытался очистить проект и перестроить все. Не работает. - person code; 05.02.2018
comment
Когда вы создаете свой проект, выполненные команды отображаются на панели вывода Compile. Не могли бы вы скопировать и вставить хотя бы одну полную команду компилятора из этого вывода в исходный вопрос? Например, у вас может быть несколько конфликтующих стандартных спецификаций в командной строке, и последняя из них побеждает... - person Eelke; 05.02.2018
comment
Спасибо, вы разместили правильный флаг. Не совсем решает мои проблемы, так как кажется, что вы не можете полностью поменять компиляторы, несмотря на то, что подразумевает графический интерфейс Qt Creator, потому что он отказывается использовать компилятор, отличный от того, что есть в его комплекте... пути жестко закодированы в Qt скомпилированные бинарники. По крайней мере, для версий, которые я разместил. - person code; 08.02.2018

Согласно этому расписанию выпусков Qt, у нас есть версия 5.2 до C++14, которая была выпущена 15 декабря 2014 г. Хотя GCC 4.8.2 поддерживает некоторое подмножество C++14, компилятор еще не совместим с C++14. Проверьте поддержку стандарта C++ в GCC.

Скорее всего, вам нужно обновить Qt как минимум до версии 5.4, чтобы включить конфигурацию CONFIG += c++14, а также компилятор должен быть новее, чем GCC 4.8.2, а лучше — не ниже GCC 5+.

Попробуйте с -std=gnu++1y, который нацелен на активацию функций C++ 14 в более ранних версиях GCC.

person Alexander V    schedule 05.02.2018
comment
То, что вы говорите, правда. Вот почему я обновил компилятор до версии 4.9.4, которая поддерживает необходимые мне функции C++14 (в частности, make_unique). Я также читал, что Qt 5.4 что-то сделал для включения конфигурации CONFIG += c++14, но я не могу использовать Qt выше 5.3.2 из-за лицензионных ограничений. Вот почему я задал вопрос. Похоже, проблема связана с Qmake или makepec или чем-то еще. С++ 14 не может быть легко включен, несмотря на поддержку компилятора. - person code; 05.02.2018
comment
* но я не могу использовать Qt выше 5.3.2 из-за лицензионных ограничений * Звучит странно. Что это за лицензия? Я работаю в организации с коммерческой лицензией Qt, мы просто получаем новую версию, когда она нам нужна. Это вторая организация с такой же коммерческой лицензией Qt, в которой я работаю. - person Alexander V; 05.02.2018
comment
Не использовать его под коммерческой лицензией здесь. ЛГПЛ 2.1. Что позволяет разработку с закрытым исходным кодом, если вы не изменяете Qt и динамически не связываетесь с ним. Не могу позволить себе 6000 долларов США в год на разработчика, чтобы получить коммерческую лицензию. 5.3.2 — последняя версия Qt, на которую распространяется лицензия LGPL 2.1. - person code; 05.02.2018
comment
Я только что обновил свой ответ: попробуйте -std=gnu++1y, который нацелен на активацию функций С++ 14 в более ранних версиях GCC. - person Alexander V; 05.02.2018