3

我刚刚从 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++ 主干中解决???


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


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

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

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

4

1 回答 1

4

这是 libc++ 的主页:

http://libcxx.llvm.org

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

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


恭喜!

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

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

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

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

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

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

libc++ 经常更新。我们试图使后备箱尖端始终处于可运输状态。

于 2013-08-10T23:33:57.883 回答