0

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

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它编译并运行正常。对于我的实际应用程序,我-std=c++11也在我的配置系统中将标志添加到链接器标志(除了编译器标志)CMake,但我仍然看到相同的错误。继续检查CMakeCache以查看标志是否已注册财产,但任何想法都值得赞赏。

编辑2:

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

4

1 回答 1

0

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

所以最后,我没有追加,而是分别指定了启用 C++11 和禁用 C++11 的情况,如下所示:

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

这工作得很好。感谢@nos 提出了一个孤立的例子。

于 2016-01-11T17:47:24.290 回答