c++ - RHEL6 上的自定义 GCC 4.8.2 使用 std::shared_ptr 给出构建错误

标签 c++ linux c++11 rhel6 gcc4.8

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

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_ptr类(class)。所以我不确定为什么我一直收到错误(是的,我在添加 -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它编译并运行正常。对于我的实际应用程序,我添加了 -std=c++11在我的 CMake 中也标记链接器标记(除了编译器标记)配置系统,但我仍然看到同样的错误。继续检查 CMakeCache查看这些标志是否已注册为属性(property),但欢迎提出任何想法。

编辑 2:

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

最佳答案

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

所以最后,我没有追加,而是针对C++11何时启用和何时禁用的情况分别赋值,如下:

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

这很好用。感谢@nos 提供了制作一个孤立示例的想法。

关于c++ - RHEL6 上的自定义 GCC 4.8.2 使用 std::shared_ptr 给出构建错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34666982/

相关文章:

c++ - 将2个Mats的内容添加到另一个Mat opencv c++

c++ - std::cout 缓冲区什么时候可以非空?

linux - Flutter for Linux 构建失败

c++ - 我可以确保 RVO 用于重新解释的值吗?

c++ - 如何最好地在我的 C++ 程序中使用相同的 Boost 日志?

c++ - 在 C++ 类中使用构造函数为 char 数组提供默认值

linux - Geany - 更改单个文件的文件类型

计算 malloc() 可以完成的最大分配后的困惑

c++ - 使用C++的新标准

c++11 - init-list-as-function-argument 和模板的重载解析存在语义错误