【问题标题】:CONFIG += c++11 (still) doesn't work on LinuxCONFIG += c++11(仍然)在 Linux 上不起作用
【发布时间】:2017-07-26 14:43:36
【问题描述】:

我已经阅读了几个关于该主题的讨论,有人说 qmake

CONFIG += c++11 添加到 .pro 并没有真正在 Makefile 中添加 CXX 标志 -std=c++11,因此会出现错误

error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.

编译时。

我正在使用最新版本的 Qt 库 (5.9.1) 开发 Linux x64(一个 Ubuntu 发行版)。使用 MSVC2015 和 MinGw 在 Windows 上编译相同的项目没有错误。

如果我声明QMAKE_CXXFLAGS += -std=c++11而不是CONFIG += c++11,它会起作用,但建议使用前一个声明,因为qmake会通过CONFIG指令自动处理CXX标志。太糟糕了,看起来它没有这样做......

【问题讨论】:

  • 不是和你的GCC版本有关吗?也许你的 ubuntu 太旧了,不能使用 C++11
  • 你能试试qmake-qt5而不是qmake吗?
  • @Xatyrian g++ 版本没问题,因为声明 QMAKE_CXXFLAGS += -std=c++11 有效
  • @G.M. qmake 实际上链接到 qt5 文件夹。即使使用 Qt 5.9.1 文件夹中的那个(qmake 3.1 版)也会得到相同的结果。我已经安装了 qmae-qt4,但我不知道如何安装/使用 qmake-qt5...

标签: c++ qt c++11 qmake


【解决方案1】:

CONFIG += c++11 应该足够了,以便使用适当的标志调用编译器以启用 C++11 支持。

但是,从 5.7 开始,Qt 需要 C++11 支持,因此即使没有 CONFIG += c++11,您也应该让编译器调用 C++11 支持。

我认为对于您的编译器,qmake “认为” c++11 支持是默认行为,并且 qmake 不会添加 -std=c++11 标志。

如果您好奇,可以查看 mkspecs 文件。正如@Swift 提到的,您必须检查您的,因为它们可能已被纠正。在我安装的 Qt 中,似乎一切正常,就像在 mkspecs/common/g++-base.conf我有 QMAKE_CXXFLAGS_CXX11 = -std=c++11 QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11

如果我是对的,这意味着您可以通过尝试使用 CONFIG += c++14(或 CONFIG += c++1z)来绕过 qmake 行为。你也可以试试CONFIG += strict_c++(或CONFIG -= strict_c++),这个选项将禁用(或启用)GNU扩展,从而强制qmake添加-std=c++11(这样g++就不会使用隐含的-std=gnu++11)。

【讨论】:

    【解决方案2】:

    CONFIG变量是用来配置Qt代码(headers,可能是metacode),所以应该在里面添加c++11来支持c++11。编译器标志是一个单独的项目,可能需要也可能不需要,具体取决于编译器及其版本,较新的 gcc 默认为标准的 gnu 版本(带扩展名),例如 gcc 6.0 - 到 gnu++14。

    【讨论】:

    • 据我了解,这样的 CONFIG 将被翻译成一个标志。正如您所说,“如果需要”。对于 MSVC2015,CONFIG += c++11 什么都不做,而QMAKE_CXXFLAGS += -std=c++11 添加了一个无用的标志(实际上,一个错误的标志,因为我收到警告“忽略未知选项 '-std=c++11'”)。无论如何,如前所述,添加 CONFIG += c++11 指令实际上并没有在 linux-g++ 上添加对 c++11 的支持
    • @il_max QMAKE_CXXFLAGS 是逐字添加到编译器命令行的内容,如果我没记错的话,CONFIG 仅影响 Qt 代码中使用的内部预处理器指令以及链接的模块。 vc2015还是不完全支持c++11!!!
    • 嗯,MSVC2015 部分支持仍然支持我需要的 c++11,所以我可以接受。问题是Linux下的qmake让我很头疼要启用g++的c++11支持
    • 只需将unix:QMAKE_CXXFLAGS+=-std=c++11 放入 .pro 文件中即可,无需为此烦恼
    • 嗯,是的,这就是我现在正在做的事情。正如各个线程中所述,希望真正由 qmake 自动完成“魔术”。
    【解决方案3】:

    我想通了。这是我的错(显然......)

    如前所述,我已通过统一安装程序脚本安装了最新版本的 Qt (5.9.1)。尽管如此,我的 QtCreator 仍然默认使用带有 Qt4 (!!) 的旧工具包,通过包管理器安装,所以它实际上使用的是不处理 CONFIG 指令的旧版本的 qmake。强制 qtchooser 使用 qt5 不会修改已用套件中设置的工具(学到了一些东西!)。使用最后一个套件,一切都按预期工作。通过命令行使用 qmake,在将 qtchooser 设置为使用 qt5 后,也可以按预期工作;我只是没有在寻找正确的 Makefile (....)。

    所以,我可以确认问题出在 qmake 版本上,正如其他线程中所说的那样。

    【讨论】:

      猜你喜欢
      • 2022-09-23
      • 1970-01-01
      • 2012-01-08
      • 2017-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多