11

经过大量的努力让 clang 和 libc++ 编译、运行、与 NetBeans 集成,甚至交叉编译到 32 位机器,我想我已经搞定了!所以我去使用一些 libstdc++ 没有的特性(完全颠覆我的开发环境的原因),然后发现......我实际上不能这样做。

libc++ 已安装,它可以工作,并且编译的程序(当它工作时)确实需要它。但是,编译器仍然会尝试使用 libstdc++ 版本,因为会弄乱命名空间;std::__1::map, std::__1::basic_string, 等等。现在,我从这个问题中知道为什么会发生这种情况,以及为什么 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++ 映射没有 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
4

1 回答 1

2

从评论:

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

DigitalMan (OP): @araqnid 确实做到了!Clang 抱怨该参数未被使用——事实上,即使它被使用和需要时仍然如此——所以我将它从 NetBeans 配置中删除。当然,错误的警告总比完全的错误要好。

于 2012-01-28T12:30:13.507 回答