【问题标题】:clang 3.2 fails on std::atomic -- a libc++ issue?clang 3.2 在 std::atomic 上失败——一个 libc++ 问题?
【发布时间】: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++


【解决方案1】:

Xcode 现在将 libc++ 捆绑在 Xcode.app 目录中。您可以通过控制单击 Xcode.app 并选择“显示包内容”来检查此目录。

【讨论】:

  • /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/c++/v1/(带有Toolchains 的奇怪目录名)确实有另一个libc++,它的atomic 不同之处在于将__a_ 声明为可变的。这解决了问题。我仍然不明白,为什么我的笔记本电脑上有这两个不同的版本。是否也有不同版本的 abi?
  • Xcode 将 libc++ 的位置从 /usr/include 更改为 internal。安装程序可能离开 /usr/include 而不是删除它。同一个 abi,​​__1,仍然是最新的。
猜你喜欢
  • 2013-07-01
  • 1970-01-01
  • 2021-06-08
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多