2013-04-25 51 views
3

我试图编译的简单代码clang 3.2在std :: atomic上失败 - 一个libC++问题?

#include <atomic> 
int bar = 0; 
void foo(std::atomic<int>&flag) 
{ bar = flag; } 

与铛++ 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

In file included from test.cc:1:

/usr/include/c++/v1/atomic:576:17: error: first argument to atomic operation must be a pointer to non-const _Atomic type ('const _Atomic(int) *' invalid)

{return __c11_atomic_load(&__a_, __m);} 
     ^    ~~~~~ 

/usr/include/c++/v1/atomic:580:53: note: in instantiation of member function 'std::_1::_atomic_base::load' requested here

operator _Tp() const _NOEXCEPT   {return load();} 
               ^

test.cc:5:9: note: in instantiation of member function 'std::_1::_atomic_base::operator int' requested here

bar = done; 

当我使用/ usr/bin/clang ++代替它(它随OS或Xcode一起)编译得很好,libC++在/ usr/lib/C++/v1中都是这样。还有另一个libv ++,它带有llvm 3.2,但我错过了吗?(我找不到任何东西在clang3.2树中)。

+0

这似乎是一个图书馆问题(虚假'const')在这里。不,libC++属于LLVM的范畴,所以你应该有正确的选择。 – 2013-04-25 14:59:10

+0

@MatthieuM。我不明白。/usr/include/C++/v1中的libC++没有使用llvm3.2下载,而是使用OS。然而xcode似乎有自己的版本(请参阅答案)。那么你对“保护伞”意味着什么 – Walter 2013-04-25 17:13:22

+0

LLVM是一个开放源代码项目,有一个(相对)明确的目标,LLVM是指涉及LLVM的项目;大多数这些项目托管在LLVM SVN服务器中。例如,Clang,libC++和lldb可以被认为是由LLVM托管的。所以,这就是说,你可能有一个新的LLVM,并且使用不是适应它的libC++,而是另一个libC++,它位于你机器上的某处。 – 2013-04-25 17:34:55

回答

1

Xcode现在将libC++捆绑在Xcode.app目录中。您可以通过按住Control键并点击Xcode.app并选择“Show Package Contents”来检查这个目录。

+0

'/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/C++/v1 /'(具有* Toolchains *的奇怪目录名称)确实存在另一个libC++,它的'atomic'不同'__a_'声明为可变。这解决了这个问题。我仍然没有得到的是为什么我的笔记本电脑上有这两个不同的版本。是否还有不同版本的abi? – Walter 2013-04-25 17:19:50

+0

Xcode将libC++的位置从/ usr/include更改为internal。可能安装程序将/ usr/include保留,而不是将其删除。同样的abi,__1仍然是最新的。 – 2013-04-26 01:26:14

相关问题