我目前在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位。
答案 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:
#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;
}
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++11
或QMAKE_CXXFLAGS += -std=c++1x
发出警告。