RHEL6 上的自定义 GCC 4.8.2 给出 std::shared_ptr 的构建错误

Custom GCC 4.8.2 on RHEL6 gives build error with std::shared_ptr

我正在使用 CMake 2.8.11 和 GCC 4.8.2。我正在构建一些使用 std::shared_ptr 的 C++ 代码,它在 MS VS 2012 中构建良好,但是当我在 RHEL6 上使用 GCC 4.8.2 尝试相同的代码时,我立即 运行 出现以下错误:

error: 'shared_ptr' is not a member of 'std'

我发现 this 问题的答案我认为已经解决,我立即将 -std=c++11 添加到我的 CMAKE_CXX_FLAGS,但我仍然将 运行 保留在错误中。我在 CMake 中简单地使用添加标志:

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" CACHE STRING "Add C++ 11 flags")

我在 CMake 中设置我的自定义编译器使用:

SET(GCC_DIR "</path/to/custom>/gcc")
SET(CMAKE_CXX_COMPILER "${GCC_DIR}/bin/g++ CACHE FILEPATH "CXX compiler")
SET(CMAKE_C_COMPILER "${GCC_DIR}/bin/gcc CACHE FILEPATH "C compiler")

包含的是

#include <memory>

反过来

#include <bits/shared_ptr.h>

定义了shared_ptrclass。所以我不确定为什么我一直收到错误(是的,我在添加 -std=c++11 编译器选项后清除了缓存并重建)。非常感谢任何想法。

编辑 1:

我创建了一个简单的程序 (main.cpp),如下所示:

#include <memory>
#include <iostream>

int main() {
  std::shared_ptr<int> pint = std::make_shared<int>();
  std::cout << "Pint points to " << pint.get() << "\n";
  return 0;
}

然后我使用 <path/to/custom/>g++ main.cpp -o prog 构建它并立即 运行 进入相同的错误(上图)。接下来我做了: <path/to/custom/>g++ -std=c++11 main.cpp -o prog 并且它编译并运行正常。对于我的实际应用程序,我在我的 CMake 配置系统中也将 -std=c++11 标志添加到链接器标志(除了编译器标志之外),但我仍然看到相同的错误。继续检查 CMakeCache 以查看标志是否已 属性 注册,但欢迎任何想法。

编辑 2:

令人惊讶的是,我在CMakeCache中发现-std=c++11标志没有被添加到CMAKE_CXX_FLAGS等。所以这一定与错误有关。我正在尝试修复它,以便它实际使用此标志。谢谢大家

答案证实了我在 EDIT 2 中的预感。显然 CMake 2.8.x 没有使用我的问题中显示的语法(根据文档)使用 SET 命令附加到变量 CMAKE_CXX_FLAGS ;我尝试了 SET 命令的其他变体来追加,但无济于事。

所以最后,我没有追加,而是分别赋值了C++11要开启和关闭的情况,如下:

IF(USE_C++11)
...
ELSE(USE_C++11)
...
ENDIF(USE_C++11)

这很好用。感谢@nos 提出了一个独立示例的想法。