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

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

本文关键字:shared std ptr 错误 构建 GCC 自定义 RHEL6      更新时间:2023-10-16

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

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

发现了这个问题,我认为已经解决了这个问题,我立即将-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类。所以我不确定为什么我总是收到错误(是的,我在添加-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提出一个孤立的例子的想法。