我有这个片段:
#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 ++一起使用?
答案 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)必须用另一个库重新编译。