我正在使用 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/