【问题标题】:LLVM libc++ not compiling with clang 3.3 on Mac OSLLVM libc++ 无法在 Mac OS 上使用 clang 3.3 编译
【发布时间】:2013-08-12 13:39:37
【问题描述】:

我刚刚从 LLVM 网页下载了 clang 3.3 (homebrew) 到我的 mac (OS X 10.8.4),但是在使用 std=c++11 stdlib=libc++ 时得到这个编译器错误:

In file included from /usr/include/c++/v1/string:434:
In file included from /usr/include/c++/v1/algorithm:594:
In file included from /usr/include/c++/v1/memory:590:
In file included from /usr/include/c++/v1/typeinfo:61:
/usr/include/c++/v1/exception:146:5: error: an attribute list cannot appear here
    _LIBCPP_NORETURN friend void rethrow_exception(exception_ptr);
    ^~~~~~~~~~~~~~~~
/usr/include/c++/v1/__config:190:28: note: expanded from macro '_LIBCPP_NORETURN'
#  define _LIBCPP_NORETURN [[noreturn]]
                           ^~~~~~~~~~~~

似乎我还需要另一个 libc++(尽管据说它在 MAC 上已 100% 完成......),但我找不到任何东西。任何帮助表示赞赏。仅供参考:

> clang++ -v
clang version 3.3 (tags/RELEASE_33/final)
Target: x86_64-apple-darwin12.4.0
Thread model: posix

而且,是的,我用谷歌搜索了它并找到了这个:http://comments.gmane.org/gmane.comp.compilers.llvm.bugs/24138 声称它已在 libc++ 主干中解决???


好的,正如 Howard 所建议的,我已将 tip-of-the-trunk libc++ 下载到 /opt/local/share/libcxx,但在构建它时遇到了麻烦。手册告诉cd libcxx/libexport TRIPLE=-apple-,然后运行./buildit。我认为这意味着bash(我通常是tcsh 用户,所以我移动了我的.tcshrc,得到了一个新的shell 并启动了bash)。我这样做了,编译成功了,但是库构建失败了。显然./buildit 没有看到$TRIPLE=-apple-,因为它选择了错误的LDSHARED_FLAG(不是第81 行的那个,而是第103 行的那个,如果没有设置$TRIPLE,则使用它),即使@ 987654336@ 应该产生-apple-。当我在buildit 的顶部添加语句echo TRIPLE = $TRIPLE 时,它什么也不报告。怎么会?这里有什么问题?


失败是因为选择了错误的LDSHARED_FLAG,所以加载不起作用(ld 抱怨未知选项-soname,我认为这在 linux 下是有意义的)。我不知道为什么buildit(一个#! /bin/sh 文件)没有选择TRIPLE 环境变量(它确实选择了几个不需要的变量,例如CXXCC)。我现在只是在该文件的顶部添加了TRIPLE=-apple-,它确实构建了库。然而,加载程序吐出了几个警告,所有这些都是形式

ld:警告:在 ___cxa_bad_typeid 中直接访问 std::bad_typeid 的全局弱符号 typeinfo 意味着在运行时不能覆盖弱符号。这可能是由于使用不同的可见性设置编译不同的翻译单元造成的。

但最重要的是,它可以工作(至少编译,我还没有测试库)。我有最后一个问题。建议是使用-I-L 告诉编译器这个版本的下落。是不是不能放到平常的地方/usr/include/c++/v1/?请注意,无论如何,Xcode 在其他地方都有它的版本,我已经在那个地方添加了一个符号链接 (/usr/include/c++/v1/) 来让我的自制 clang 3.2 工作(在一些 Xcode 更新之后)。图书馆呢?我也可以把它放在一个标准的地方吗?

【问题讨论】:

  • 有什么理由不使用 XCode 4.6.3 命令行工具(Apple LLVM 4.2 和 clang-425.0.28)?它们由 Apple 直接提供,可通过 Xcode -> Preferences -> Download 轻松安装。
  • @sudopunk 是的:我想要最新版本的 clang(Apple LLVM 4.2 是 llvm 3.1,但已经有 3.3)。

标签: c++ c++11 clang libc++


【解决方案1】:

这里是libc++的主页:

http://libcxx.llvm.org

您可以从那里下载树干末端的 libc++。您可以使用 -nostdinc++ -I<path-to-libc++>/include 告诉 clang 指向您的下载。您还可以告诉 clang 使用 -L<path-to-libc++>/libexport DYLD_LIBRARY_PATH=<path-to-libcxx>/lib 链接到您的树干末端 libc++。说明都在 libc++ 主页上。

Xcode 是获得 clang + libc++ 的最简单方法。但如果你想要最新的,这里就是你要去的地方。


恭喜!

不用担心 ld 警告。这是一个无害的 ld 错误,将在未来的版本中修复。我在 10.8.4 上也看到了,没有任何伤害。

libc++ 标头不再存在于/usr/include/c++/v1。 Xcode 已将它们迁移到自身中。来自较早安装的 /usr/include/c++/v1 的 libc++ 标头一直是混乱和错误的根源。我经常使用 -nostdinc++ -I 指向我想要的 libc++ 头文件(我经常同时有多个版本),这对我来说很有效。

您可以将/usr/lib/libc++.1.dylib 替换为您已构建的。我不建议这样做。我不得不有时进行适当的测试,但我总是非常小心地这样做,因为有时这会导致我不得不重新启动到备份磁盘并将我的/usr/lib 恢复到其原始状态。如果您确实走这条路,最好备份原始的/usr/lib/libc++.1.dylib 非常方便。

我建议在命令行中使用 -L,在 shell 中使用 export DYLD_LIBRARY_PATH=<path-to-libcxx>/lib。不止一个人(包括我自己)因不遵循此建议而使他们的计算机陷入了非常糟糕的境地。

如果你运行testit(在test/ 下),你只需要在那个shell 中运行DYLD_LIBRARY_PATHtestit 脚本设置为无需安装即可指向正确的位置。

另外我建议弄清楚为什么你必须修改buildit。没有其他人看到这种行为。命令行中的printenv 可能有助于这项工作。

libc++ 经常更新。我们尽量使后备箱末端始终处于可运输状态。

【讨论】:

  • 没有。但我的意思是说我经常在 10.8.4 上运行 tip-of-trunk clang + tip-of-trunk libc++,我愿意与你合作,直到你实现同样的目标。
  • 好的,所以下载了tip-of-the-trunk libc++,但构建失败。如果您能帮我解决这个问题,我们将不胜感激,但这些 cmets 不适合。我将改为编辑问题。
  • 将 TRIPLE 拼错为 TRIPPLE。
  • 哎呀。不仅在我的问题中,而且在尝试中也没有。不幸的是。
  • 调试直到echo TRIPLE = $TRIPLE 确认您正在尝试执行的操作。您是在一个 shell 中设置 TRIPLE 并在另一个 shell 中运行 ./buildit 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 2014-03-28
  • 2011-09-22
  • 2013-10-27
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
相关资源
最近更新 更多