经过一番努力,我终于把clang和libc++编译、运行、与NetBeans集成甚至跨平台编译到32位机器上都搞定了。我以为我已经掌握了全部!但是我发现,当我想要使用一些libstdc++没有的功能(这也是我改变我的开发环境的原因),却发现我实际上做不到。
虽然libc++已经安装并且能够工作,并且编译后的程序(如果可以正常工作)确实需要它。然而,编译器仍然尝试在每一个机会下使用libstdc++版本,通过操纵命名空间;std::__1::map
,std::__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
std::__1::map
在libc++
中而不是在libstdc++
中。你能展示给我们一个错误信息吗? - Matthieu M.-std=c++0x
,这是不需要的吗?std::map::emplace
是一个C++11方法吗? - araqnid