【发布时间】:2013-04-19 09:17:35
【问题描述】:
我尝试编译简单的代码
#include <atomic>
int bar = 0;
void foo(std::atomic<int>&flag)
{ bar = flag; }
使用 clang++ 3.2(从 llvm.org 下载为 llvm 3.2;在 mac os.x 10.8.3 上失败并出现错误
/> clang++ -std=c++11 -stdlib=libc++ -O3 -march=native -c test.cc
在 test.cc:1 中包含的文件中:
/usr/include/c++/v1/atomic:576:17: 错误:原子操作的第一个参数必须是指向非 const _Atomic 类型的指针('const _Atomic(int) *' 无效)
{return __c11_atomic_load(&__a_, __m);} ^ ~~~~~/usr/include/c++/v1/atomic:580:53: 注意:在成员函数的实例化中 'std::_1::_atomic_base::load' 在这里请求
operator _Tp() const _NOEXCEPT {return load();} ^test.cc:5:9: 注意:在成员函数 'std::_1::_atomic_base::operator int' 的实例化中请求这里
bar = done;
当我改用 /usr/bin/clang++(随操作系统或 Xcode 提供)时,它编译得很好。在这两种情况下,libc++ 都位于 /usr/lib/c++/v1。
我错过了什么? llvm 3.2 中是否还有另一个 libc++,但我错过了? (我在 clang3.2 树中找不到任何东西)。
【问题讨论】:
-
这里似乎是一个库问题(虚假的
const)。不,libc++ 属于 LLVM 保护伞,所以你应该拥有正确的。 -
@MatthieuM。我不明白。 /usr/include/c++/v1 中的 libc++ 没有随 llvm3.2 下载,而是随操作系统一起提供。然而 xcode 似乎有自己的版本(见答案)。那么“伞”是什么意思
-
LLVM 是一个具有(相对)明确目标的开源项目,LLVM 保护伞是指与 LLVM 相关的项目;大多数这些项目都托管在 LLVM SVN 服务器中。例如,可以将 Clang、libc++ 和 lldb 视为由 LLVM 托管。因此,话虽如此,您可能有一个新的 LLVM,并且使用的不是适用于它的 libc++,而是另一个 libc++,位于您机器上的某个位置。
标签: c++ c++11 clang atomic libc++