LLVM libc++在Mac OS上无法使用clang 3.3编译

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++ trunk中得到解决???


好的,如Howard所建议的那样,我已经将最新版本的libc++下载到/opt/local/share/libcxx中,但是在构建时遇到了问题。手册上说要执行cd libcxx/libexport TRIPLE=-apple-,然后运行./buildit。我猜这意味着要使用bash(我通常使用tcsh,所以我移动了我的.tcshrc,启动了一个新的shell并开始使用bash)。我做到了,编译工作正常,但库构建失败了。显然,./buildit没有看到$TRIPLE=-apple-,因为它选择了错误的LDSHARED_FLAG(不是第81行的那个,而是第103行的那个,如果$TRIPLE未设置,则应使用该标志),尽管echo $TRIPLE输出了应该输出的-apple-。当我在buildit的顶部添加语句echo TRIPLE = $TRIPLE时,它什么也没报告。这是怎么回事?出了什么问题?


失败的原因是选择了错误的LDSHARED_FLAG,导致加载失败(ld抱怨未知选项-soname,在Linux下这是有道理的)。我不知道为什么buildit(一个#! /bin/sh文件)没有获取到TRIPLE环境变量(它却获取到了一些不需要的变量,比如CXXCC)。我现在只是在文件顶部添加了TRIPLE=-apple-,然后它就构建成功了。然而,加载器输出了几个警告,所有的警告都是以下形式:

ld: 警告:在___cxa_bad_typeid中直接访问全局弱符号typeinfo for std::bad_typeid意味着该弱符号无法在运行时被覆盖。这可能是由于不同的翻译单元使用了不同的可见性设置所导致的。

但最重要的是,它可以工作(至少编译可以,我还没有测试库)。我有一个最后的问题。建议使用-I-L告诉编译器这个版本的位置。难道不能把它放到通常的地方 /usr/include/c++/v1/吗?请注意,Xcode已经有了另一个版本,并且我已经用符号链接(/usr/include/c++/v1/)链接到那个版本,以使我的homebrew clang 3.2可以工作(在一些Xcode更新之后)。那库呢?我可以把它放在标准位置吗?


你为什么不使用XCode 4.6.3命令行工具(Apple LLVM 4.2和clang-425.0.28)?它们由苹果直接提供,并且可以通过Xcode -> 首选项 -> 下载轻松安装。 - slaterade
@sudopunk 是的:我想要最新版本的clang(Apple LLVM 4.2是llvm 3.1,但已经有3.3了)。 - Walter
1个回答

4
这是libc++的主页:

http://libcxx.llvm.org

你可以从那里下载最新版本的libc++。你可以使用-nostdinc++ -I<path-to-libc++>/include指定clang指向你的下载位置。你还可以使用-L<path-to-libc++>/libexport DYLD_LIBRARY_PATH=<path-to-libcxx>/lib命令告诉clang链接到你的最新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 ++,并且我愿意与您合作,直到您达到相同的效果。 - Howard Hinnant
好的,我下载了最新版本的libc++,但是构建失败了。如果你能帮我解决这个问题,我将不胜感激,但是这些评论并不适合。我会编辑问题的描述。 - Walter
将 TRIPLE 拼错成了 TRIPPLE。 - Howard Hinnant
抱歉,我的问题中没有“只有”,但在尝试中出现了。不幸的是。 - Walter
失败看起来是什么样子? - Howard Hinnant
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接