在构建qmake项目时如何使用C ++ 14功能?

时间:2014-09-30 18:04:16

标签: c++ qt c++14 qmake

我目前在Qt应用程序中使用C ++ 11功能。但是,我想在我的应用程序中使用一些新的C ++ 14功能。

要在Qt应用程序中启用C ++ 11,只需在 qmake 项目文件中添加一行,即:

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位。

4 个答案:

答案 0 :(得分:30)

This is now supported properly from Qt 5.4。您只需在qmake项目文件中输入:

CONFIG += c++14

Thiago在2014年中期进行了必要的代码更改:

Add support for CONFIG += c++14

我刚刚创建了必要的文档更改:

Mention the c++14 CONFIG option in the qmake variable reference

请注意,只有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

答案 1 :(得分:10)

Qt Creator 只是IDE

您可以将IDE视为&#34; 更智能的文本编辑器&#34;这有助于开发人员进行调试,构建,代码完成,文件管理等。

IDE在编译过程中无关紧要。

重要的是你的编译器。你的IDE中它是独立的

g ++ 4.8.x 不支持许多C ++ 14功能:check out this page to learn what C++14 features are supported

答案 2 :(得分:5)

出于某种奇怪的原因,这就是Qt的作用: 如果编译器是gcc或mingw,CONFIG+=C++14将转换为编译器标志-std=c++14(您所期望的那样)

如果它是另一个编译器(如clang),CONFIG=C++14会被愚蠢地转换为-std=c++11(原文如此!),因此即使您的clang版本正确,您也会收到有关不支持功能的错误支持C ++ 14。

要修复它,请明确指定标志:

QMAKE_CXXFLAGS += -std=c++14

这样,您确定您的编译器(g ++,mingw或clang)将收到正确的标志。

答案 3 :(得分:4)

使用带有 qmake 的C ++ 14和Qt 5.4之前的版本(它与 Qt Creator 或其他IDE一起使用它没有任何区别或者从命令行)和 gcc ,将其添加到 .pro 文件中:

QMAKE_CXXFLAGS += -std=c++1y

qmake 使用Qt 5.4获得CONFIG += c++14的支持,因此您可以将其用于您至少需要该版本Qt的项目。请务必使用显式编译器标志,或使用CONFIG选项,但不能同时使用两者,以避免出现冲突。


不幸的是 gcc 4.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++11QMAKE_CXXFLAGS += -std=c++1x发出警告。