我有一个项目,我已经工作了一段时间,总是在调试。今天我试着构建一个版本,但它无法编译,抛出了一些非常奇怪的错误。当调试编译没有任何警告时,release抛出:
/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")
如何跟踪导致发布中的编译错误的原因?
编辑我使用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编译。这是故意的吗?
我打赌问题出在这一行:
set(CMAKE_CSS_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=gnu++11 -Wall")
看,你设置了变量CMAKE_CSS_FLAGS_RELEASE
。您可能只想设置变量CMAKE_CXX_FLAGS_RELEASE
。这就解释了为什么你的c++11没有在发布模式下启用。
我已经通过简单地删除CXX_FLAG修复了这个问题,并使用CMake的添加定义:
add_definitions("-std=gnu++11")
我不知道为什么这使它工作,为什么调试工作,而发布没有,但它有很大的不同。