如何在 qmake 中禁用 C++11?

Posted

技术标签:

【中文标题】如何在 qmake 中禁用 C++11?【英文标题】:How to disable C++11 in qmake? 【发布时间】:2018-01-31 00:01:33 【问题描述】:

项目文件:

CONFIG -= qt
QMAKE_CXXFLAGS += -std=c++98
QMAKE_CXXFLAGS -= -std=c++11
QMAKE_CXXFLAGS -= -std=gnu++11
CONFIG -= c++11

结果:

g++ -c -pipe -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-but-set-variable -Wno-reorder -Wno-missing-field-initializers -std=c++98 -DDEBUG -g -std=gnu++11 -Wall -W -fPIC -DQT_QML_DEBUG -I../../qqq -I. -I../src/jsoncpp -I../lib -I../../../../Qt/5.9.1/gcc_64/mkspecs/linux-g++ -o ../build/debug/obj/TaskManager.o ../src/TaskManager.cpp
g++ -c -pipe -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-but-set-variable -Wno-reorder -Wno-missing-field-initializers -std=c++98 -DDEBUG -g -std=gnu++11 -Wall -W -fPIC -DQT_QML_DEBUG -I../../qqq -I. -I../src/jsoncpp -I../lib -I../../../../Qt/5.9.1/gcc_64/mkspecs/linux-g++ -o ../build/debug/obj/Utils.o ../src/Utils.cpp

如您所见,选项 -std=gnu++11 仍然存在(对 "QMAKE_CXXFLAGS -="/"CONFIG -=" 没有任何反应)。

Qt:

Qt Creator 4.3.1
Based on Qt 5.9.1 (GCC 5.3.1 20160406 (Red Hat 5.3.1-6), 64 bit)
Built on Jun 29 2017 04:10:39

非常感谢。


附:我在干净的系统上遇到了 gnu++11(带有 gcc 扩展的 c++)的兼容性问题

./qqq: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by ./qqq)
./qqq: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by ./qqq)
./qqq: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.21' not found

并想使用 c++11 (没有 gcc 扩展的 c++)而不是 gnu++11 没有任何扩展,但我不能禁用它:-(

【问题讨论】:

我不确定您是否要完全禁用 C++11(并切换到 C++98),或者您是否只想禁用 GNU 扩展并使用“普通”C++11 .在后一种情况下,它只是CONFIG += strict_c++ 您是否在更改 .pro 文件后强制 qmake 运行?我见过对 .pro 文件进行更改并且没有重新运行 qmake 的情况,因此旧选项仍然有效。 @peppe 非常感谢。 gnu++11 真的消失了。这就是我要的。但是我担心 Qt 项目在配置方面会遇到这些麻烦,因为我仅将 Qt Creator 用作没有任何 Qt 功能的 IDE:作为文本编辑器和调试器。因为这对我们来说是最舒适的 IDE(例如,与 NetBeans 相比)。但是是否可以强制设置编译器,例如当我写 c++98 或没有任何 C++ 的本机 C 时?我的意思是打开 qt 项目,而不是 CMakeLists。我怎么记得 CMakeLists + Qt Creator 一切正常(我前段时间用 CMakeLists + Qt Creator 编译了 C 项目)。 @jwernerny 是的,我敢肯定,因为我的 pro 文件 (message("...")) 中有调试输出,并且每次保存后它都会重新运行。否则我无法从我的专业文件中看到我的消息。此外,在这种情况下,每次保存后我都会手动运行 qmake,因为我看到了这种真正的谵妄:我告诉 qmake 我想使用哪种编译器/语言,而 qmake 会忽略我的设置。 我也需要禁用 c++11,但是在项目文件中设置 CONFIG += strict_c++ 不会删除它。 makefile 在 CXXFLAGS 中仍然包含-std=c++11 -std=c++11。是的,我强迫 qmake 重新创建它。有什么建议吗? 【参考方案1】:

根据您使用的平台,您可能需要使用QMAKE_CXX_FLAGS 来设置编译器的语言方言。 CONFIG 变量设置为 c++11 或 strict-c++ 将配置 Qt 头文件以符合这些设置,但否则它将使用编译器的默认方言,对于 GCC 和 mingw 是 gnu++XX。 (对于 gcc 8.0 最高 1z)

【讨论】:

以上是关于如何在 qmake 中禁用 C++11?的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何使用英特尔的 Windows 编译器在命令行上禁用 C++0x 和/或 C++11?

如何配置 QtCreator 以使用 C++11?

Windows 上的 QtCreator/QMake 完全禁用调试构建

QT creator如何在Ubuntu中配置环境变量path

如何在 qmake 中删除更改默认 CFLAGS?

Qmake - 如何配置包含路径顺序?