C++ LLVM libc++;不使用Mac OS上的clang 3.3进行编译

C++ LLVM libc++;不使用Mac OS上的clang 3.3进行编译,c++,c++11,clang,libc++,C++,C++11,Clang,Libc++,我刚刚将clang 3.3(自制)从LLVM网页下载到我的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: I

我刚刚将clang 3.3(自制)从LLVM网页下载到我的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

是的,我在谷歌上搜索了一下,发现了这样一个问题:声称它是在libc++主干中解决的


好的,正如Howard所建议的,我已经将主干libc++的提示下载到了/opt/local/share/libcxx中,但在构建它时遇到了困难。手册上说要
光盘libcxx/lib
导出TRIPLE=-apple-
,然后运行
/buildit
。我认为这意味着
bash
(我通常是
tcsh
用户,所以我移动了
.tcshrc
,获得了一个新shell并启动了
bash
)。我这样做了,编译成功了,但是库构建失败了。显然,
/buildit
没有看到
$TRIPLE=-apple-
,因为它选择了错误的
LDSHARED\u标志(不是在第81行,而是在第103行,如果未设置
$TRIPLE
,将使用该标志),即使
echo$TRIPLE
会产生
-apple-
。当我在
buildit
顶部添加语句
echo TRIPLE=$TRIPLE
时,它不报告任何内容。怎么会?这里怎么了


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

ld:警告:在uuuu cxa_bad_typeid中直接访问std::bad_typeid的全局弱符号typeinfo意味着无法在运行时重写弱符号。这可能是由使用不同可见性设置编译的不同翻译单元造成的


但最重要的是,它是有效的(至少在编译过程中,我还没有测试这个库)。我还有最后一个问题。建议使用
-I
-L
告诉编译器该版本的位置。难道不可能把它放在通常的地方吗
/usr/include/c++/v1/
?请注意,Xcode在其他地方也有它的版本,我已经添加了一个符号链接(
/usr/include/c++/v1/
),以使我的自制Clang3.2正常工作(在某些Xcode更新之后)。图书馆怎么样?我可以把它放在一个标准的地方吗?

这是libc++的主页:

您可以从那里下载主干libc++的技巧。您可以告诉clang使用
-nostdinc++-I/include
指向您的下载。您还可以告诉clang使用
-L/lib
export DYLD\u LIBRARY\u PATH=/lib
链接到您的主干libc++提示。说明都在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
,在shell中使用
export DYLD\u LIBRARY\u PATH=/lib
。不止一个人(包括我自己)因为没有遵循这个建议而把电脑弄到了一个非常糟糕的地方

如果运行
testit
(在
test/
下),则只需在该shell中运行
DYLD\u LIBRARY\u PATH
testit
脚本设置为指向正确的位置,无需安装

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


libc++经常更新。我们试图使主干顶端始终处于可交付状态。

您不使用XCode 4.6.3命令行工具(Apple LLVM 4.2和clang-425.0.28)的原因是什么?它们由苹果直接提供,并通过Xcode->Preferences->Download轻松安装。@sudopunk是:我想要最新版本的clang(苹果LLVM 4.2是LLVM 3.1,但已经有了3.3)。否。但我的意思是说,我经常在10.8.4上运行tip of trunk clang+tip of trunk libc++,我愿意与您合作,直到您实现同样的目标。好的,所以下载了tip of trunk libc++,但构建失败。如果你能帮我,这将是非常感谢,但这些评论是不合适的。我将改为编辑问题。拼写错误的TRIPLE为TRIPPLE.oops。不,只在我的问题上,但不在t