Ubuntu12.04编译llvm+clang失败(3.4/3.5)及成功(3.3)的尝试

原创 2015年01月20日 20:02:50

编译Mesa时的一个经典错误!

错误详情:

checking for RADEON... yes
configure: error: LLVM is required to build Gallium R300 on x86 and x86_64

注意,这里需要自己下载安装>3.1版本的LLVM,因为用sudo apt-get install llvm装的版本不够新,用不了,还是会提示同样错误。因为之前(这里)装过,记得这个错误,所以下文是直接下载3.5版本,编译安装。

下载LLVM 3.5.0,

http://llvm.org/releases/download.html#3.5

下载的压缩文件为:llvm-3.5.0.src.tar.xz

sudo tar -xvf llvm-3.5.0.src.tar.xz

cd llvm-3.5.0.src/

sudo ./configure


会提示如下错误:

checking whether GCC is new enough... no
configure: error: The selected GCC C++ compiler is not new enough to build LLVM. Please upgrade to GCC 4.7. You may pass --disable-compiler-version-checks to configure to bypass these sanity checks.

只需升级一下gcc,g++版本,不会可以点这里

sudo ./configure

sudo make

sudo make install
完成。

但是,继续编译Mesa,sudo ./configure --disable-dri3,却报如下错误:

checking for RADEON... yes
configure: error: Could not find llvm shared libraries:
    Please make sure you have built llvm with the --enable-shared option
    and that your llvm libraries are installed in /usr/local/lib
    If you have installed your llvm libraries to a different directory you
    can use the --with-llvm-prefix= configure flag to specify this directory.
    NOTE: Mesa is attempting to use llvm shared libraries by default.
    If you do not want to build with llvm shared libraries and instead want to
    use llvm static libraries then add --disable-llvm-shared-libs to your configure
    invocation and rebuild.

开始以为是configure文件里的option(BUILD_SHARED_LIBS "Build all libraries as shared libraries instead of static" ON)类似问题。但是:
sudo gedit configure
打开果然搜索到类似的一个地方,但是人家说明默认是已经开启的!!
  --enable-shared         Build a shared library and link tools against it  (default is NO)

这次深究了一下,对比了二进制源码和我已经成功编译的版本区别在哪里?于是进入/usr/local/lib,查看到了很多LLVM的包,与“clang+llvm-3.3-amd64-Ubuntu-12.04.2”对比,发现少了二进制中有的clang开头的很多libclang*.a的文件。原来确实不是我以前看到说的那样BUILD_SHARED_LIBS没设置为ON,而是因为我没有安装Clang包。

LLVM和Clang是2个库,只是经常一起用,官网提供的二进制预编译好的包是将2者编译放在一起了,所以我原来直接用他们2进制包没问题。但是独立编译安装LLVM后,却一直提示“error: Could not find llvm shared libraries”,原来是缺少了Clang包,应该装一下就行:

下载LLVM 3.5.0下面的Clang源文件,

http://llvm.org/releases/download.html#3.5

下载后的文件名为:cfe-3.5.0.src.tar.xz,

sudo tar -xvf cfe-3.5.0.src.tar.xz

cd cfe-3.5.0.src

gedit README.txt

可以看到这么一句提醒:

Welcome to Clang.  This is a compiler front-end for the C family of languages (C, C++, Objective-C, and Objective-C++)which is built as part of the LLVM compiler infrastructure project. 同时可以参考这里这里,可知Clang的编译是需要放到LLVM/tools文件夹下面。具体编译方法如下:

1)将下载后解压得到的clang的源代码文件夹名称改为clang:

sudo cp -r cfe-3.5.1.src clang
cd llvm-3.5.0.src/tools/
sudo mv ../../clang/ ./

2)重新编译安装llvm和clang
cd llvm-3.5.0.src/
sudo ./configure
sudo make
sudo make install

谁知,装完继续编译Mesa仍然还报同样错误?编译的哪里不对?

毕竟我目的不是老折腾这个库,又有点想放弃编译,直接用官网提供的编译好的了,现在适合我系统的版本的已经有LLVM 3.4.2的Pre-built Binaries:

想想还是觉得没道理,又仔细对比了安装好的库和二进制库(3.4.2的(clang+llvm-3.4.2-x86_64-unknown-ubuntu12.04.xz)和之前下载的3.3的(clang+llvm-3.3-amd64-Ubuntu-12.04.2.tar.gz)),发现这2个版本都有.../lib/clang/3.4.2/lib/linux/libclang_rt.*.a等若干库,而我编译的/usr/local/lib/clang/3.5.0目录下只有一个include文件夹,根本没有/lib/linux文件夹。难道是这个原因?又到clang的官网仔细看了下编译步骤,人家说的很详细:

Checkout Compiler-RT:

  • cd llvm/projects
  • svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
  • cd ../..
大概意思是需要把compiler-rt这个东西放到llvm/projects目录下再编译。于是官网下载LLVM 3.5.0下面对应的Compiler RT source code (.sig),下载后文件名为compiler-rt-3.5.0.src.tar.xz,解压改名为:compiler-rt,并拷贝至llvm/projects目录下。再次编译(为了将事情做到极致,这次我也离开了源代码目录,乖乖在外面新建了build文件夹进行编译),按官方方式:

Build LLVM and Clang:

  • sudo mkdir llvm-build (for building without polluting the source dir)
  • cd llvm-build
  • ../llvm-3.5.0.src/configure
  • sudo make
  • sudo make install

编译时间太长,每次make大约需要等待1.5小时,8G内存的新电脑尚且如此,一般用户哪经得起这折腾啊????再说我也不是闲的没事的人,所以我决定这次编译还是不行的话,我就直接用3.4.2的Pre-built Binaries。以前用过3.3的没问题,这次想试试3.4.2的。

漫长等待过后,make install完成,发现/usr/local/lib/clang/3.5.0/lib/linux目录出现了。里面有那些libclang_rt.*.a等若干库。欣喜!

悲剧的是,问题依旧:

configure: error: Could not find llvm shared libraries:
    Please make sure you have built llvm with the --enable-shared option
    and that your llvm libraries are installed in /usr/local/lib
    If you have installed your llvm libraries to a different directory you
    can use the --with-llvm-prefix= configure flag to specify this directory.
    NOTE: Mesa is attempting to use llvm shared libraries by default.
    If you do not want to build with llvm shared libraries and instead want to
    use llvm static libraries then add --disable-llvm-shared-libs to your configure
    invocation and rebuild.

我想应该是二进制版本是完全编译的,我这里编译的始终是缺少部分包(比如LibC++,Clang Tools Extra,Dragonegg...),不太了解官网那一堆源文件到底应该装哪些:

    Clang source code (.sig)
    LLVM source code (.sig)
    Compiler RT source code (.sig)
    Dragonegg source code (.sig)
    LibC++ source code (.sig)
    LibC++ ABI source code (.sig)
    LLDB source code (.sig)
    LLD source code (.sig)
    Polly source code (.sig)
    OpenMP source code (.sig)
    Clang Tools Extra (.sig)
    LLVM Test Suite (.sig)

至少目前3.5.0版本还没有我这个系统的二进制包可用。烦了,编译到此为止,果断删除:

sudo make uninstall

现在只剩一条路了。直接用3.4.2的(clang+llvm-3.4.2-x86_64-unknown-ubuntu12.04.xz。下载后,解压,将解压得到的文件夹:

cd clang+llvm-3.4.2-x86_64-unknown-ubuntu12.04/
ls
bin  docs  include  lib  share

分别拷贝到/usr/local/下对应的文件夹内。悲剧的是依旧同样错误“Could not find llvm shared libraries”。这似乎是一个涉及到llvm-config的bug。llvm-defaults: please provide a usable llvm-config executable in every llvm version。please consider shipping a usable llvm-config executable in every llvm version. Currently it is shipped only for the recommended version, other versions have only a llvm-config suffixed with the version (e.g. llvm-config-3.2). This will ease llvm usage since one could just use plain llvm-config which should point to the current installed version, or, if more are available, to a suggested one.


现在唯一想做的就是用低版本,稳定版本!!!尤其对于我这种新手对于版本太多的Linux库又不是很熟的情况下,以后千万不要盲目追求新版本。

原来试过3.3版本的二进制版(clang+llvm-3.3-amd64-Ubuntu-12.04.2.tar.gz),worked。但是今天同样方法试了,却不行,怪的是也报“Could not find llvm shared libraries”。因为之前手动拷贝3.4.2版本的二进制,而且不知道是否删除干净,所以我不确定问题再哪里。

最后的最后,解决这个问题的办法居然是:

我直接编译3.3版本的源文件(llvm-3.3.src.tar.gz和cfe-3.3.src.tar.gz),详细步骤在此

将下载后解压得到的cfe-3.3.src改名为clang,并拷贝到:llvm-3.3.src/tools/目录结构如下:

<llvm-3.3.src>
    tools
        clang
然后编译llvm:

cd llvm-3.3.src
./configure --enable-shared=yes
sudo make
sudo make install
安装成功后,编译Mesa,不再报这个错!


参考:

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=697497

http://flexwang.me/blog/2014/07/17/ubuntu14-dot-04shang-mesa3dde-bian-yi-yu-an-zhuang/

版权声明:本文为博主原创文章,未经博主允许不得转载。

如何使用ninja快速编译LLVM和Clang(以llvm3.3为例子)

在使用Make工具编译LLVM是非常耗时的。往往需要三四个小时。但是使用goolge开源的ninja编译LLVM只需要10到20分钟。 本文以llvm3.3为例,演示在linux上编译和安装过程。 ...
  • dreammeard
  • dreammeard
  • 2014年02月19日 15:58
  • 3020

编译Mesa:configure: error: Could not find llvm shared libraries

Welcome to Clang. This is a compiler front-end for the C family of languages (C, C++, Objective-C, ...
  • arackethis
  • arackethis
  • 2015年01月20日 21:45
  • 1016

linux下clang+llvm3.3安装(ubuntu)

最近要用clang api进行一些简单的查错处理(往高里说叫Runtime Verification),结果配置环境弄了好久......(linux基础知识很重要.....makefile要学好,gc...
  • u012288873
  • u012288873
  • 2014年03月06日 20:41
  • 2032

编译clang的时候ld进程耗尽内存

http://www.oschina.net/question/2722424_2169402
  • jaybsr
  • jaybsr
  • 2017年03月08日 14:02
  • 214

安装llvm3.8.0时遇到的问题,FAILED: lib/libLTO.so or FAILED: lib/libclang.so.3.8

在llvm官方(http://llvm.org/docs/GettingStarted.html)给出的安装需求中,提到硬件:仅安装llvm需要1-3GB的空间。安装llvm和clang则需要15-2...
  • lands92
  • lands92
  • 2016年06月01日 13:01
  • 1029

Building LLVM on Ubuntu 12.04 32bit and Ubuntu 13.04 64bit ——LLVM安装编译手记

阿萨德发送到分
  • kinghuangjin
  • kinghuangjin
  • 2013年12月08日 20:31
  • 2842

从代码开始编译clang/llvm

译至:http://d.hatena.ne.jp/embedded/20140827/p1
  • robertsong2004
  • robertsong2004
  • 2014年08月27日 12:12
  • 1814

在 Ubuntu 14.04 上编译 llvm 和 clang 3.8

很早之前的草稿,当时研究 KLEE 的需要。 0. 安装依赖: cmake -DCMAKE_BUILD_TYPE=Release ../llvm-3.8.0.src/ 1...
  • iDeatheart
  • iDeatheart
  • 2016年10月27日 15:28
  • 1137

Ubuntu16.04 从源码编译LLVM+Clang

最近在安装一个Vim自动补全插件——YouCompleteMe,这个插件可以根据语义补全,因此需要Clang这个库,不过LLVM的官网并没有提供Ubuntu的预编译二进制版本,所以需要自己从源码编译。...
  • wr132
  • wr132
  • 2017年01月04日 14:10
  • 2578

Ubuntu下编译LLVM

参考: 编译LLVM: [1]http://blog.csdn.net/snsn1984/article/details/8593380 编译cmake: [2]http://speakingb...
  • kkxsj
  • kkxsj
  • 2015年06月01日 22:24
  • 861
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Ubuntu12.04编译llvm+clang失败(3.4/3.5)及成功(3.3)的尝试
举报原因:
原因补充:

(最多只允许输入30个字)