2013-04-25 49 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

相關問題