centos下安装llvm+clang

不知道从神马时候开始,llvm+clang 就进入了 me 的眼球,以前只知道有 gcc,有 vc++。llvm 是个编译器的 back-end,像 JVM 或是 .NET 的 CLR (公共语言运行时), clang 是编译器的 front-end,负责将 c、c++、objective-c、objective-c++ (objective-c 和 c++的混合) 编译成中间语言。 c++11/14 支持最好的两个编译器 gcc 和 clang,前者版本到了 4.8.2 (GCC),后者 3.4 (Clang)。gcc 是前辈,而 clang 是后起之秀,对于学习 c++14 来说更好的选择是 clang (完全支持 c++11 语言、库和 c++14 的所有草案)。

me 使用的是 centos 系统,使用赶脚很不爽,上面很多包没有安装是一方面,另一方面有些包的版本过低,如果自己安装的话,使用命令 $rpm -ql package 完全搜不到(安装信息),O__O"…。前面安装 GCC 4.8.1 如此,这次安装 llvm+clang 亦如此。

安装 llvm+clang

首要的去处应该是官方的参考文档。大体说来,有三部分需要安装:llvm + clang + complier-rt。在安装 clang 3.3 的时候,me 的 compiler-rt 总是安装不成功,不过后来发现即使这一部分不安装,llvm+clang 也能工作。至于 compiler-rt 部分安装不成功,可能是因为依赖包 texinfo 版本过低,也可能是 centos 下的一个 bug 问题,具体是哪个,me 暂时也不甚清楚。在安装 clang 3.4 的时候安装没有这个问题(看来应该是 llvm 的 bug)。

下载安装 llvm+clang 其实比较简单了,实际上可以直接下载二进制版本,省去自己编译;即使自己编译,也没有 gcc 的困扰多。官网可以通过 svn 下载(最新版本),也可以下载打包的稳定版本 3.3,总之三部分 llvm+clang+compiler-rt 是分开的,llvm+clang 是必需的。假设 llvm 在 llvm 目录下,那么 clang 应该是在 llvm/tools 下,compiler-rt 是在 llvm/projects 下。下面是通过 svn 下载以及编译安装的步骤:

  1. # 检出源代码
  2. $ cd LLVM    # llvm 的安放目录 LLVM,当然可以换成其他的
  3. $ svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm    # llvm 源代码在 LLVM/llvm 下
  4.  
  5. $ cd llvm/tools    # 切换到 LLVM/llvm/tools 下
  6. $ svn co http://llvm.org/svn/llvm-project/cfe/trunk clang    # clang 源代码在 LLVM/llvm/tools 下
  7.  
  8. $ cd ../projects    # 切换到 LLVM/llvm/projects 目录下
  9. $ svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt    # compiler-rt 在 LLVM/llvm/projects
  10. $ svn co http://llvm.org/svn/llvm-project/test-suite/trunk test-suite    # 这一步是可选的
  11.  
  12. # 配置
  13. $ cd ../..     # 切换到 LLVM 下
  14. $ mkdir build    # 创建一个编译目录,以免混淆源文件
  15. $ cd build
  16.  
  17. $ ../llvm/configure --prefix=/usr/local/llvm --enable-optimized --enable-targets=host-only    # 安装文件放在 /usr/local/llvm 下;优化+只编译适应本机的代码
  18.  
  19. # 编译和安装
  20. $ make     # 如果多核的话,可以 make -j4 (4个工作线程)
  21. $ make install    # 安装,如果有权限问题请 sudo make install

按照上面的步骤,如果一切都成功的话, llvm + clang 最后的安装文件安放在 /usr/local/llvm 下,有 bin 目录、lib 目录、include 目录等。编译一个 hello.c 或是 hello.cpp,使用 $ clang hello.c、$ clang++ hello.cpp、$ clang++ -std=c++11 hello.cpp 。

Article type: 

Comments

如果一切都正常的话最好,不过总有人会遇到一些问题,这就是 linux 的烦人之处,O__O"…

make 时间太长

源码安装三步骤:./configure + make + make install 。 第二步 make 编译步骤是最耗时的, 可以加上编译选项让其运行得快一点。

$ make -j4 是开 4 个 jobs 同时进行编译; --enable-optimized --enable-targets=host-only 优化编译 + 针对本机的结构进行编译,一方面可以加快编译,而是可以少占很多磁盘空间。最初没有加后面选项的时候,编译的结果有 6 G多,加上之后只有 400+M 。

关于 GLIBCXX 版本过低的问题

如果 llvm+clang 成功编译,但在编译 c++ 程序的时候提示 GLIBCXX 版本过低肿么办?O__O"… GLIBCXX 貌似是 GCC 的库呀,赶脚有些坑爹,O__O"… 看样纸,clang 会使用 libstdc++.so.6 这个库,如果 gcc 版本过低,libstdc++.so.6 实际指向 libstdc++.so.6.0.13,那么么着,需要安装更新的 gcc 。而实际上 me 在 /usr/local/gcc 下已经安装有最新的 GCC,在对应的 lib64 下有 libstdc++.so.6.0.18,所以,me 只需要删除 libstdc++.so.6 这个符号链接就可以,或是将这个符号链接定向到 6.0.18。

查看 libstdc++.so.6.0.13 中的 GLIBCXX 到那个版本的方法:

$ strings /usr/lib64/libstdc++.so.6.0.13 | grep GLIBCXX

me 看到的 libstdc++.so.6.0.13 的 GLIBCXX 到 3.4.13,而 clang 3.4 需要 GLIBCXX 3.4.15 以上,libstdc++.so.6.0.18 的 GLIBCXX 到 3.4.19。

编译过程中出现:/usr/bin/ld: /usr/lib/libcurses.a(lib_setup.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC 问题

以前编译 clang 3.3 (3.4)的时候 me 没有(重)装 ncurses 库,在 make 的时候没有出现问题;后来因为重新装了 ncurses 库,现在装 clang 3.4(3.5) 的时候出现了这个问题。

重装 ncurses 库, 在 make 的时候加上 -fPIC 选项,也就是 $ make CFLAGS='-fPIC' CXXFLAGS='-fPIC'。 简而言之,如果出现类似的问题,可能都需要重装依赖的库,加上编译选项 -fPIC 。

精诚所至,金石为开