Clang3.0+llvm本身的编译和安装不在这里介绍, 官方站点中 http://clang.llvm.org/ 和 http://llvm.org/ 有详细的介绍. 这里介绍的是如何在mac os x上组建一个自含的clang3.0 + Boost_1_49_0 + libc++ 套装(ld和dyld当然必须用系统自己的....).
llvm这套东西是编译器的底层后端,为了跟上层提供一个完备统一的后续处理支持而存在的. 你可以理解为,有了这货后你写个编译器会简单许多. 这货本身是Apple对Gcc不满(无法在协议下闭源,OC优先级太低...etc)后的产物(其实是人家另一套人马在搞,Apple拐骗了他们...), 总之不管如何既然是apple自己的牛货,用着osx的我就没有理由不体验下....
考虑倒系统自己也带了gcc4.2和svn3.0版的clang, 为了不搞得太混乱,我决定把这个clang装在单独的/usr/yylocal下(其实很多装来玩的东西都丢这里了,这样万一玩残了不至于连系统也一起残了... 大了不起这个目录干掉再来...), 同时在用这个clang编译一套c++标准库 libc++,这货是 cang.llvm.org主页上给出的 http://libcxx.llvm.org/ , 我用它代替libstdc++, 作为标准c++库使用. 最后通过这两者,在编译一套最新的Boost 1.49库配合即可.
我是希望将libc++编译成libyystdc++.1.dylib库, 然后给clang编译器添加一个新的--stdlib==yylibc++标志,当你指定了该标志或者不指定任何标志时, c++标准库默认连接倒/usr/lib/libyystdc++.dylib上, 同时会在/usr/yylocal/include/yy-c和yy-c++目录中搜索头文件. 这样就彻底的避免了新的clang编译器以及c++库对系统中已存在ToolChain可能产生的影响.
为了达到这个目的, 根据构建LFS过程中学习到的经验, 我直接修改了clang的源码, 添加了在连接 libyystdc++.dylib时的搜索路径,(yy-c和yy-c++) 将默认链接库从libstdc++改为libyystdc++.dylib, 同时新增加了针对--stdlib=libyyc++选项的处理(代码很简单的....grep一下谁都能改出来....),
libc++ 编译很简单,但是如果你需要编译出来的库可以用gdb调试的话,那么需要修改下编译脚本 buildit, 这个脚本的最后 会将所有的.o文件删除,这样gdb就找不到对应的调试信息, 将rm *.o 这句注释掉即可. 另外,如果希望自己编译出来的libc++库能够被正确连接,并且不至于覆盖掉系统自带库的话, Buildit的line78这里 -install_name 参数一定要改掉,否则和这个库连接时,目标程序中嵌入的库地址永远是/usr/lib/libc++.1.dylib, 那你就不得不覆盖这个系统的库文件了 ,在libc++主页上有句友好的提示: OS X need a vaild libc++ to boot....因此我觉得还是换个-install_name吧,免得不小心把系统给玩残了....
最后就该Boost了, 为了能使用自己的clang++,需要定制一个编译配置文件user-config.jam, 位于用户根目录~下. 内容只有下面这行:
using darwin : : "/usr/yylocal/bin/clang++" ;
Boost和clang以及libc++搭配编译还是会有些问题的. 中间编译警告不断, 这些警告可以通过修改编译文件删除不需要的参数免除, 不过一来我压根不熟悉jam的语法(为什么不用gmake....?!), 二来这也无所谓了, 虽然我已经明确找到了需要修改的地方, 但是就不想费这个形而上学的电了....另外有2个错误. 错误原因其实都一样, map.erase()调用有二义性,虽然我看这个声明不应该有二义性问题, 因为我写了测试代码实验没问题, 因此感觉比较像是clang自己的问题.
修改Boost代码中上述两个位置,使用const_iterator作为临时变量传递iterator即可。
libs/signals/src/named_slot_map.cpp:105:12:
//hacked by yaoyuan: for complie on clang 3.0 & libc++
const_group_iterator t = group;
groups.erase(t);
libs/signals/src/named_slot_map.cpp:128:26:
//hacked by yaoyuan: for complie on clang 3.0 & libc++
const_group_iterator t = g;
groups.erase(t);
++g;
至此Boost编译通过, 之后将头文件和库文件都按照安装说明装好即可.
posted on 2012-04-08 17:02
无毁湖光 阅读(413)
评论(0) 编辑 收藏 引用