【问题标题】:Qt 5.7 adding -std=gnu++11 to my compiler flags, clobbering -std=c++14Qt 5.7 添加 -std=gnu++11 到我的编译器标志,破坏 -std=c++14
【发布时间】:2017-04-09 07:02:05
【问题描述】:

我在 CMakeLists.txt 中设置了以下标志

set(CMAKE_CXX_FLAGS "-std=c++14 -g -O0")

然后我使用find_package 定位Qt5Test

find_package(Qt5Test REQUIRED)

然后我正在创建一个Model Test

add_library          (modeltest STATIC ${SRCS})
target_link_libraries(modeltest Qt5::Test)

由于某种原因,我将 -fPIC -std=gnu++11 添加到我的编译器标志中

CMakeFiles/modeltest.dir/flags.make:CXX_FLAGS = -std=c++14 -g -O0 -fPIC -std=gnu++11

这破坏了我的 -std=c++14 标志,导致我程序中的所有 c++14 功能最终都成为编译器错误:

error: ‘foo’ function uses ‘auto’ type specifier without trailing return type
constexpr auto foo()
                   ^
note: deduced return type only available with -std=c++14 or -std=gnu++14
  • 有没有办法解决这个问题?
  • 我正在使用今天从他们的网站下载的最新版本的 Qt 5.7

【问题讨论】:

  • 当然有“解决这个问题的方法”——在极端情况下,您可以使用正确的标志手动编译每个目标文件。问题应该是“what 是解决这个问题的方法”。我(不幸的是)不知道答案,但它必须位于您的构建系统中的某个位置以及您如何聚合编译器参数..
  • @skypjack 啊!这绝对敲响了警钟!我现在不在我的电脑前,但会尝试一下并告诉你。谢谢!

标签: c++ qt c++11 cmake c++14


【解决方案1】:

不要明确设置CMAKE_CXX_FLAGS
改用这个:

set(CMAKE_CXX_STANDARD 14)

这肯定会为每个目标设置使用标准。


根据 cmets 的建议,还应考虑以下几点:

set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

有关详细信息,请参阅this 链接。
感谢@CraigScott 指出这一点。


正如 @wasthishelpful 在 cmets 中所提到的,属性 CXX_STANDARDCXX_STANDARD_REQUIREDCXX_EXTENSIONS 也可用于每个目标的配置。
有关详细信息,请参阅上面的链接。

【讨论】:

  • 您还应该设置CMAKE_CXX_STANDARD_REQUIREDCMAKE_CXX_EXTENSIONS。请参阅this article 了解原因。
  • 顺便提一下,CXX_STANDARDCXX_STANDARD_REQUIREDCXX_EXTENSIONS 属性也可用于 per-target 配置
  • 我在使用 Qt 5.10 的 QtCreator 中使用 Clang 时遇到了类似的问题。在我的 Clang 构建中,设置了“-std=gnu++11”标志,它覆盖了由于我的 .pro 文件中的行而设置的“-std=c++17”标志:QMAKE_CXXFLAGS += -std =c++17... QtCreator 会在某处生成 CMake 文件吗?
  • @IronAttorney Nope.
  • 我找到了一个由 qmake 生成的 makefile。它列出了包括冒名顶替者 gnu++11 标志在内的标志......我可以删除它,但是当然,当我再次尝试构建时,QMake 会重新生成 makefile、坏标志和所有......
猜你喜欢
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
相关资源
最近更新 更多