2012-01-25 37 views
9

在经过大量的努力让clang和libC++编译,运行,与NetBeans集成,甚至交叉编译到32位机器之后,我想我已经搞清楚了!所以我去使用libstdC++没有的一些功能(将开发环境颠倒过来的全部理由),并发现......我实际上无法做到这一点。libC++ - 将std重命名为std :: __ 1?

libC++已安装,它的工作原理和编译后的程序(当它工作时)确实需要它。然而,编译器仍然试图在每个机会上使用libstdC++版本,通过混淆命名空间; std::__1::mapstd::__1::basic_string等等。现在,我从this question知道为什么会发生这种情况,为什么libC++会这么做。我只需要知道如何去掉它,因为它完全不适用 - 我真的真的想要使用libC++版本,而且在我的代码中没有任何东西需要这两种类型共存。

我已经尝试将libstdC++文件夹移出包含路径,并且失败了,导致它们完全无法访问。没有运气。我没有使用任何附加库,只使用内置的Linux/POSIX头文件(errno,socket,syslog,fcntl)。

编辑:错误消息:

CoreCache.cpp:61:12: error: no member named 'emplace' in 'std::__1::map<std::__1::basic_string<char>, CacheEntry, std::__1::less<std::__1::basic_string<char> >, std::__1::allocator<std::__1::pair<const std::__1::basic_string<char>, CacheEntry> > >' 

的的libstdC++映射没有布设()。 libC++版本确实是

下面的调用,通过命令行,似乎工作:

clang++ -o stachecache -I /usr/local/lib/clang/3.1/include/ -I /usr/include/c++/v1/ -std=c++0x -stdlib=libc++ ./*.cpp 

调用从NetBeans中并不:

clang++ -stdlib=libc++ -O3 -c -O3 -Werror -MMD -MP -MF build/Release/clang-Linux-x86/CoreCache.o.d -o build/Release/clang-Linux-x86/CoreCache.o CoreCache.cpp 
+3

事实上,'的std :: __ 1 :: map'是'的libC++'*不*在'的libstdC++'。你能告诉我们一个错误消息吗? –

+0

我在帖子中添加了错误。地图的libC++版本有emplace(),但libstdC++(尝试通过std :: __ 1 :: map访问)版本不支持。 – DigitalMan

+0

你可以使用你的命令行吗?我们检查你是否通过了正确的选项? (例如,stdlib:“clang ++ -stdlib = libC++”) –

回答

2

从评论:

araqnid: 您的NetBeans调用没有-std=c++0x,是不是需要? std::map::emplace是一个C++ 11方法。

DigitalMan(OP): @araqnid这实际上做到了! Clang抱怨说这个论点没有被使用 - 事实上,即使它被使用和需要时,它依然会这样做 - 所以我将它从NetBeans配置中拿出来了。当然,错误的警告比完全错误要好。

相关问题