GCC C++11 调试构建,发布失败

Posted

技术标签:

【中文标题】GCC C++11 调试构建,发布失败【英文标题】:GCC C++11 Debug builds, Release fails 【发布时间】:2013-06-04 01:25:02 【问题描述】:

我有一个项目我已经工作了一段时间,始终处于调试状态。 今天我尝试构建一个版本,它无法编译并抛出一些非常奇怪的错误。 虽然调试编译没有任何警告,但发布抛出:

/usr/include/c++/4.7/bits/c++0x_warning.h:32:2: 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.

两个 CMake 版本都启用了 c++11:

set(CMAKE_CXX_FLAGS_DEBUG "$CMAKE_CXX_FLAGS_DEBUG -std=gnu++11 -Wall -g")
set(CMAKE_CSS_FLAGS_RELEASE "$CMAKE_CXX_FLAGS_RELEASE -std=gnu++11 -Wall")

如何跟踪 Release 中导致编译错误的原因?

编辑我正在使用 Cmake 2.8 并尝试使用 gcc-4.6.3 和 4.7.2 进行编译,但都有同样的问题。

EDIT#2 使用 -std=c++0x 而不是 c++11 时问题仍然存在。

EDIT#3 降级到 g++4.6 并没有多大帮助。错误现在简单地更改为:

/usr/include/c++/4.6/bits/c++0x_warning.h:32:2:etc...

EDIT#4 我删除了首先引起问题的<thread>。然后是<mutex><atomic>。现在它是任何使用std::shared_ptr<Blah> 的代码。 在我看来,好像 Release 根本不想用 C++11 编译。这是故意的吗?

【问题讨论】:

【参考方案1】:

我敢打赌问题出在这一行:

set(CMAKE_CSS_FLAGS_RELEASE "$CMAKE_CXX_FLAGS_RELEASE -std=gnu++11 -Wall")

看,你设置了变量CMAKE_CSS_FLAGS_RELEASE。您可能只是想设置变量CMAKE_CXX_FLAGS_RELEASE。这可以解释为什么您的 c++11 未在发布模式下启用。

【讨论】:

【参考方案2】:

我通过简单地删除 CXX_FLAG 并使用 CMake 的添加定义解决了这个问题:

add_definitions("-std=gnu++11")

我不知道为什么这使它工作,以及为什么调试工作但发布没有,但它产生了很大的不同。

【讨论】:

以上是关于GCC C++11 调试构建,发布失败的主要内容,如果未能解决你的问题,请参考以下文章

启动失败没有二进制文件 - gcc 与 eclipse

Linux编译器gcc/g++调试器gdb项目自动化构建工具make/Makefilegit

调试应用程序分段错误?编译器的错?

使用安装了 GCC 4.9 的 MacPorts 调试符号错误?

构建工作,但发布期间的预编译失败

Visual C++ 查找导致“调试断言失败”的行