libc++ - 如何停止将std重命名为std::__1?

13

经过一番努力,我终于把clang和libc++编译、运行、与NetBeans集成甚至跨平台编译到32位机器上都搞定了。我以为我已经掌握了全部!但是我发现,当我想要使用一些libstdc++没有的功能(这也是我改变我的开发环境的原因),却发现我实际上做不到。

虽然libc++已经安装并且能够工作,并且编译后的程序(如果可以正常工作)确实需要它。然而,编译器仍然尝试在每一个机会下使用libstdc++版本,通过操纵命名空间;std::__1::mapstd::__1::basic_string等等。现在,我知道从这个问题中讲述了为什么会出现这种情况,以及为什么libc++会这样做。我只需要知道如何消除它,因为它完全不适用 - 我真的、真的想要使用libc++版本,并且我的代码中没有任何需要两种类型共存的东西。

我已经尝试将libstdc++文件夹从include路径中删除,但是失败了,所以我彻底让它们不可用。但是没有成功。我没有使用任何附加库,只有内置的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++的map没有emplace()函数,而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::maplibc++ 中而不是在 libstdc++ 中。你能展示给我们一个错误信息吗? - Matthieu M.
我已将错误添加到帖子中。libc++版本的map具有emplace()函数,但libstdc++版本(通过std::__1::map尝试访问)没有该函数。 - DigitalMan
你能否提供你的命令行,这样我们就可以检查你是否正确传递了选项?例如,标准库:"clang++ -stdlib=libc++"。 - Matthieu M.
4
你的NetBeans调用没有-std=c++0x,这是不需要的吗?std::map::emplace是一个C++11方法吗? - araqnid
@araqnid,这真的起作用了!Clang抱怨该参数未使用,实际上即使在使用和需要时仍然会抱怨,因此我将其从NetBeans配置中删除了。有缺陷的警告肯定比完全错误好。 - DigitalMan
1个回答

2

从评论中得知:

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

DigitalMan (OP): @araqnid 这真的做到了!Clang 抱怨说该参数未使用 - 实际上即使在使用且必要时它仍然会抱怨 - 所以我已将其从 NetBeans 配置中删除。一个错误的警告肯定比一个完整的错误好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接