【发布时间】:2012-01-25 10:05:38
【问题描述】:
经过大量努力让 clang 和 libc++ 编译、运行、与 NetBeans 集成,甚至交叉编译到 32 位机器,我想我已经搞定了!所以我去使用一些 libstdc++ 没有的功能(完全颠覆我的开发环境的原因),然后发现……我实际上做不到。
libc++ 已安装,它可以工作,并且编译的程序(当它工作时)确实需要它。但是,编译器仍然会在任何时候尝试使用 libstdc++ 版本,方法是弄乱命名空间; std::__1::map、std::__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++ 映射没有 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++中。你能告诉我们一条错误信息吗? -
我在帖子中添加了错误。 map 的 libc++ 版本有 emplace(),但 libstdc++(试图通过 std::__1::map 访问)版本没有。
-
您能否也使用您的命令行,我们检查您是否通过了正确的选项? (即 stdlib 例如:“clang++ -stdlib=libc++”)
-
您的 NetBeans 调用没有
-std=c++0x,是不需要吗? std::map::enplace 是 C++11 方法吗? -
@araqnid 确实做到了! Clang 抱怨该参数未被使用——事实上,即使它被使用和需要时仍然如此——所以我将它从 NetBeans 配置中删除。当然,错误的警告总比完全的错误要好。