我刚刚从 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/lib
、export TRIPLE=-apple-
和 run ./buildit
。我认为这意味着bash
(我通常是tcsh
用户,所以我移动了我的.tcshrc
,得到了一个新的 shell 并开始了bash
)。我这样做了,编译成功了,但是库构建失败了。显然./buildit
没有看到$TRIPLE=-apple-
,因为它选择了错误LDSHARED_FLAG
(不是第 81 行,而是第 103 行,如果$TRIPLE
未设置,则将使用它),即使它应该echo $TRIPLE
产生。当我在顶部-apple-
添加语句时,它什么也不报告。怎么会?这里有什么问题?echo TRIPLE = $TRIPLE
buildit
失败是因为LDSHARED_FLAG
选择了错误,加载不起作用(ld
关于未知选项的抱怨-soname
,我认为这在 linux 下是有意义的)。我不知道为什么buildit
(一个#! /bin/sh
文件)没有拾取TRIPLE
环境变量(它确实拾取了几个不需要的变量,例如CXX
and 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 更新之后)。图书馆呢?我也可以把它放在一个标准的地方吗?