【问题标题】:How can I use C++14 features when building qmake projects?在构建 qmake 项目时如何使用 C++14 功能?
【发布时间】:2014-11-25 11:00:15
【问题描述】:

我目前在我的 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 位。

【问题讨论】:

  • 另外,我对问题进行了一些编辑,以使您的问题更清楚。如果我理解错了,请不要犹豫回滚。
  • 也许也值得一读:woboq.com/blog/cpp14-in-qt.html

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


【解决方案1】:

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

【讨论】:

  • 刚刚在 Mac 上使用下面的 about 框信息进行了尝试,然后查看编译器命令行,奇怪的是它实际上缺少 -stdlib=libc++ 标志?它看起来像(已编辑):clang++ -c -pipe -g -isysroot /Applications/Xcode.app/... -mmacosx-version-min=10.7 -std=c++1y -Wall -W -fPIEQt Creator 3.3.0 (opensource) Based on Qt 5.4.0 (Clang 6.0 (Apple), 64 bit) Built on Dec 8 2014 at 15:34:58 From revision d36c4d87db 有什么想法有什么问题吗?我将标志添加为 QMAKE_CXXFLAGS 并且一切正常。 (耶make_unique!)
【解决方案2】:

Qt Creator 只是一个IDE

您可以将 IDE 视为“更智能文本编辑器”,帮助开发人员进行调试、构建、代码完成、文件管理等。

IDE 在编译期间是不相关的。

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

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

【讨论】:

  • 其实这个问题不是那么多关于编译器,它是关于qmake...(它没有内置支持启用C++14,至少现在还没有)。
  • gcc 实际上不支持完整的 c++11 功能集。例如 constexpr 到目前为止还没有完全实现(在某些情况下,实际的编译器会抛出错误消息“尚未实现”)
  • @hyde,对新标准的支持是编译器的特性,它与 qmake 无关
  • @N1ghtLight:OP 正在询问如何使用 qmake!
【解决方案3】:

出于某种奇怪的原因,这是 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)将收到正确的标志。

【讨论】:

  • 很好的发现!!!正是我为 android 编译的问题,它强制转换为没有 make_unique 的 C++11。谢谢!
  • 我试过CONFIG=C++14,但没用。然后我尝试了你的答案并解决了这个问题。谢谢。
【解决方案4】:

将 C++14 与 qmake 与 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),但您可以使用以下代码 sn-p 进行测试:

#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 会发出警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多