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_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
并且它编译并运行正常。对于我的实际应用程序,我在我的 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 提出了一个独立示例的想法。
我正在使用 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_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
并且它编译并运行正常。对于我的实际应用程序,我在我的 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 提出了一个独立示例的想法。