【发布时间】: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/lib、export 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 环境变量(它确实选择了几个不需要的变量,例如CXX 和CC)。我现在只是在该文件的顶部添加了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)。