Clang无法使用libstdc ++识别std :: shared_ptr

时间:2014-10-19 04:16:44

标签: c++ c++11 clang++

我有这个片段:

#include <memory>
int main() {
  std::shared_ptr<int> p(new int);
}

如果我使用clang++ -std=c++0x -stdlib=libstdc++ main.cpp进行编译,则会出现此错误:

main.cpp:4:8: error: no member named 'shared_ptr' in namespace 'std'
  std::shared_ptr<int> p(new int);
  ~~~~~^

使用stdlib=libc++时效果很好。 libstdc ++的版本是6.0.9,编译器是

$ clang++ --version
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix

使用clang version 3.5.0 (tags/RELEASE_350/final)时,我看到相同的结果。

我已经意识到如果我使用tr1它会有效,但这对我来说似乎不那么便携了:

#include <tr1/memory>
int main() {
  std::tr1::shared_ptr<int> p(new int);
}

那么,是否可以将std::shared_ptr与clang和libstdc ++一起使用?

1 个答案:

答案 0 :(得分:1)

Mac发布了一个非常旧版本的GCC(4.2.1),当然它带有一个非常古老的libstdc ++。 LLVM的Getting Started页面说:

  

如果您打算使用Clang的C ++支持,您可能需要告诉它如何使用   找到您的C ++标准库头文件。一般来说,Clang会   检测可用的最佳版本的libstdc ++头文件并使用它们 -   它将同时用于libstdc ++的系统安装以及   与Clang相邻的装置。如果您的配置适合   这两种情况都不能使用--with-gcc-toolchain   configure选项告诉Clang包含所需的gcc   libstdc ++已安装。

这是最简单的方法,只需将其指向现代GCC安装的位置即可。如果您不想重新编译Clang,那么您可以尝试按照mailing list中的说明操作:

  

是的,当然。找到标准库并不神奇,你可以   只需添加一些-isystem,-L和可能的-Wl,-rpath参数   clang ++使用它时。使用-v选项查看clang正在使用的内容   默认情况下,您可以添加相同的s / 4.4 / 4.7 / g。如果铿锵   首先放置一个自己的目录(在gcc之前),确定   自己再次指定它,所以它仍然首先结束。你甚至可以   尝试一些像   -nostdinc ++来清理一下(再次,用-v检查列表是否有意义)。

     

- Marc Glisse

请记住,如果你设法让clang ++使用更新的libstdc ++,那么libstdc ++和libc ++就是binary incompatible。这意味着用一个编译的任何库(例如Boost)必须用另一个库重新编译。