web-dev-qa-db-ja.com

QtCreatorでg ++ 7.2を使用してc ++ 17機能を使用できない

最近、gccとg ++をバージョン7.2に更新しました。試してみたいstd::experimental::anyおよびstd::variant特に、私はQtCreatorでQt 5.9.1を使用しています。

これまでのところ、プロジェクトファイルにこれを書いています。

CONFIG += c++17

そして、正しい場所に正しいヘッダーを追加しました:

#include <variant>
#include <experimental/any>

問題なく動作します。ただし、バリアントヘッダーファイルを含めると、次のエラーが表示されます。

/usr/include/c++/7/bits/c++17_warning.h:32: error: #error This file requires compiler and library support for the ISO C++ 2017 standard. This support must be enabled with the -std=c++17 or -std=gnu++17 compiler options.

#errorこのファイルにはコンパイラとライブラリのサポートが必要です\ ^ ~~~~

プロジェクトファイルでさまざまなことを試しました。完全なリストは次のとおりです。

CONFIG += c++17

CONFIG += c++1z

QMAKE_CXXFLAGS += -std=c++17

QMAKE_CXXFLAGS += -std=c++1z

CONFIG += c++17
QMAKE_CXXFLAGS += -std=c++17

CONFIG += c++1z
QMAKE_CXXFLAGS += -std=c++1z

CONFIG += c++11
CONFIG += c++14
CONFIG += c++17

それは私が考えることができる暗闇の中ですべての刺し傷です。私は何が欠けていますか?そして、なぜexperimental::anyバリアントがコンパイルしないときにコンパイルしますか?

使用しないでくださいCONFIG += c++xxおよびQMAKE_CXXFLAGS一緒にこの方法で、しかし、私は他に何も動作しないので、それをやってみると思いました。ボーナスポイントについては、既に17のCONFIGを設定しているときに、14と11のCONFIG呼び出しを追加する必要があるのでしょうか?

編集:

これは、ほとんどのファイル名を削除したコンパイラ出力です。

18:04:10: Running steps for project AIQt...
18:04:10: Configuration unchanged, skipping qmake step.
18:04:10: Starting: "/usr/bin/make" 
/home/pete/Qt/5.9.1/gcc_64/bin/qmake -o Makefile ../AIQt/AIQt.pro -spec linux-g++ CONFIG+=debug CONFIG+=qml_debug
WARNING: Failure to find: ../src/stdafx.h
WARNING: Failure to find: ../src/Csound/csd.h
g++ -c -pipe -g -Wall -W -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_QML_DEBUG -DQT_DATAVISUALIZATION_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../AIQt -I. -I../src -I../src/AIBase -I../src/Maths -I../src/Random -isystem /usr/local/include/csound -I../../../../Qt/5.9.1/gcc_64/include -I../../../../Qt/5.9.1/gcc_64/include/QtDataVisualization -I../../../../Qt/5.9.1/gcc_64/include/QtWidgets -I../../../../Qt/5.9.1/gcc_64/include/QtGui -I../../../../Qt/5.9.1/gcc_64/include/QtCore -I. -isystem /usr/include/libdrm -I. -I../../../../Qt/5.9.1/gcc_64/mkspecs/linux-g++ -o main.o ../AIQt/main.cpp
In file included from /usr/include/c++/7/variant:35:0,
                 from ..###,
                 from ..###,
                 from ..###,
                 from ..###,
                 from ..###,
                 from ..###,
                 from ..###,
                 from ..###:
/usr/include/c++/7/bits/c++17_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2017 standard. This support must be enabled with the -std=c++17 or -std=gnu++17 compiler options.
 #error This file requires compiler and library support \
  ^~~~~
In file included from ..###,
                 from ..###
                 from ..###,
                 from ..###,
                 from ..###,
                 from ..###,
                 from ..###:
../src/AIBase/Geno.h:70:18: error: ‘variant’ in namespace ‘std’ does not name a type
             std::variant m_valueVariant;
                  ^~~~~~~
In file included from ..###,
                 from ..###,
                 from ..###,
                 from ..###,
                 from ..###,
                 from ..###:
../src/AIBase/Pheno.h:22:13: warning: type qualifiers ignored on function return type [-Wignored-qualifiers]
             const double getGenoValue(size_t genoIndex) const;
             ^~~~~
../src/AIBase/Pheno.h:24:13: warning: type qualifiers ignored on function return type [-Wignored-qualifiers]
             const UserRating getRating() const;
             ^~~~~
In file included from ..###,
                 from ..###:
../AIRadioQt/GraphDialog.h:16:15: warning: declaration ‘struct ar::ai::ClusterList’ does not declare anything
 class ar::ai::ClusterList;
               ^~~~~~~~~~~
make: *** [main.o] Error 1
18:04:13: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project AIQt (kit: Qt 5.9.1 GCC 64bit)
The kit Qt 5.9.1 GCC 64bit has configuration issues which might be the root cause for this problem.
When executing step "Make"
18:04:13: Elapsed time: 00:03.

回答:

Nwpで述べたように、私はそれをきれいにして再構築する必要がありました。

別のポスターもCONFIG += c++17はまだサポートされていないようです。そのため、QMAKE_CXXFLAGS += -std=c++17。彼はコメントをすぐに削除したので、ドキュメントをチェックしてくれた私に個人的に感謝することはできません。

18
Iron Attorney

CONFIG += c++17はQt 5.12以降で使用できます。

Qt 5.11以前では、 QMakeフラグとして認識されていません であり、少し手を汚す必要があります。

QMAKE_CXXFLAGS += -std=c++17を追加すると、GCCとClangの仕事ができます。 MSVCの場合、 おそらく指定する必要があります/std:c++17または/std:c++latest

25
minexew

Edit 3/2019:Qt 5.12以降はCONFIG += c++17を使用できます。


実際のフラグはc++1zではなくc++17です。つまり、C++ 17のサポートを得るために、QMAKE_CXXFLAGSを変更する必要はなく、代わりにCONFIG += c++1zを使用するだけです。

このバグレポートにあります の理由についての議論ですが、それは「C++ 17が標準化される前にc++1zとして実装したため、今はそうではありません」わざわざエイリアスを作成します。」

注:クリーンアップと再構築が必要であることがわかりました。 「C++ 17サポートを有効にするためにどのフラグを使用する必要がありますか?」という根本的な質問に答えています。

7
Jon Harper

Windowsの場合:ダウンロード中qt-opensource-windows-x86-5.11.1、MinGW32が含まれています。 MinGW64の場合、qt-5.5.0-x64-mingw510r0-seh-rev0をダウンロードし、コンパイラのみをインストールします。 here のようにQtCreatorを構成します。新しいプロジェクトを作成して、QMAKE_CXXFLAGS + = -std = gnu ++ 1zを.proファイル(- gcc doc )に追加します。テストのために、次の簡単なコードをコンパイルしてみてください。

#include <optional>

std::optional<int> foo() 
{
    return std::nullopt;
}

int main(int argc, char *argv[])
{
    foo();
}
1
magrif