web-dev-qa-db-ja.com

qmakeプロジェクトをビルドするときにC ++ 14機能を使用するにはどうすればよいですか?

現在、QtアプリケーションでC++ 11機能を使用しています。ただし、アプリケーションでいくつかの新しいC++ 14機能を使用したいと思います。

QtアプリケーションでC++ 11を有効にするには、qmakeプロジェクトファイルに1行追加するだけです。つまり:

CONFIG += c++11

またはこれは以前のバージョンの場合:

QMAKE_CXXFLAGS += -std=c++1y

私はすでにC++ 14でも同じことをしようとしましたが、うまくいきませんでした。 qmakeプロジェクトの上記の行を次のように変更しました。

CONFIG += c++14

またはこれは以前のバージョンの場合:

QMAKE_CXXFLAGS += -std=c++1y

その後、プロジェクトをビルドしようとすると、以前には存在しなかった多くのコンパイルエラーが表示されます。プロジェクトは正常にコンパイルされますが、C++ 14の機能を使用しようとすると、コンパイルエラーが発生します。これは一例です:

template<typename T>
constexpr T pi = T(3.1415926535897932385);

これは対応するエラーです:

main.cpp:7: error: template declaration of 'constexpr const T pi'
constexpr T pi = T(3.1415926535897932385);  
          ^

QtCreatorでqmakeプロジェクトを使用するときにC++ 14機能を有効にする方法

Qt 5.3.2、Qt Creator 3.2.1、およびMinGW 4.8.2 32ビットを使用しています。

22
Rickforce

Qt Creatorは単なる [〜#〜] ide [〜#〜] です。

IDEは「smartertext editors」と考えることができ、開発者がデバッグ、ビルド、コード補完、ファイル管理などを支援します。

IDEはコンパイル中は無関係です。

重要なのはコンパイラです。そして、IDEからは独立しています

g ++ 4.8.xは、多くのC++ 14機能をサポートしていません: C++ 14機能がサポートされているものについては、このページをご覧ください

10
Vittorio Romeo

これはQt 5.4から適切にサポートされるようになりました 。これをqmakeプロジェクトファイルに入力するだけです。

CONFIG += c++14

必要なコードの変更は、Thiagoによって2014年半ばに行われました。

CONFIG + = c ++ 14のサポートを追加

必要なドキュメントの変更を作成しました。

qmake変数リファレンスのc ++ 14 CONFIGオプションに言及

変数テンプレートはgcc 5.0からのみサポートされますが、コードは問題なく機能することに注意してください。これは、古いgccでC++ 14をテストするために使用できます。

main.cpp

#include <iostream>

int main()
{
    // Binary literals: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3472.pdf
    // Single-quotation-mark as a digit separator: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3781.pdf
    std::cout << 0b0001'0000'0001;
    return 0;
}

main.pro

TEMPLATE = app
TARGET = main
CONFIG -= qt
CONFIG += c++14
SOURCES += main.cpp

ビルドして実行

qmake && make && ./main

出力

257
31
lpapp

奇妙な理由により、これはQtが行うことです。コンパイラがgccまたはmingwの場合、CONFIG+=C++14はコンパイラフラグ-std=c++14に変換されます(予想どおり)

別のコンパイラ(clangなど)の場合、CONFIG=C++14-std=c++11(sic!)に愚かに変換されるため、clangバージョンがC++ 14を正しくサポートしていても、サポートされていない機能に関するエラーが発生します。

修正するには、フラグを明示的に指定します。

QMAKE_CXXFLAGS += -std=c++14

これにより、コンパイラー(g ++、mingw、またはclang)が正しいフラグを確実に受け取るようになります。

5
pierre

Qt 5.4より前のバージョンでqmakeでC++ 14を使用するには(Qt Creatorまたは他のIDEまたはコマンドラインから)およびgcc、これを。proファイル:

QMAKE_CXXFLAGS += -std=c++1y

qmakeはQt 5.4でCONFIG += c++14をサポートするため、少なくともそのバージョンのQtを必要とすることに慣れているプロジェクトに使用できます。スイッチの競合を避けるために、明示的なコンパイラフラグを使用するか、CONFIGオプションを使用してください。同時に両方を使用しないでください。


残念ながらgcc4.8.2はごく少数のC++ 14機能をサポートしています( here を参照)が、このコードスニペットでテストできます:

#include <iostream>

auto f() { return 42; }

int main()
{
    std::cout << f() << std::endl;
}

QMAKE_CXXFLAGS += -std=c++1yで問題なくコンパイルできますが、CONFIG += c++11またはQMAKE_CXXFLAGS += -std=c++1xで警告が表示されます。

4
hyde