我刚从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/lib
,export 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
环境变量(它却获取到了一些不需要的变量,比如CXX
和CC
)。我现在只是在文件顶部添加了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更新之后)。那库呢?我可以把它放在标准位置吗?