在Windows下面进行LLVM与CLANG的安装(转载)
原文链接:在Windows下面进行LLVM与CLANG的安装
在Windows下面进行LLVM与CLANG的安装
目录 § 1 需要环境 § 2 用SVN下载source code § 3 编译llvm及clang § 4 安装 § 5 验证与练习 |
需要环境
本文假设你已经有下面的工具安装在系统中,并且可以正确的使用。
§ SVN client (这是为了抓最新的llvm与clang的source code)
§ cmake
§ mingw32
用SVN下载source code
假设我们要将所有的LLVM与Clang程序码放到c:\llvm_src,并且要将最后的llvm放到c:\llvm的目录下。要注意,clang必须放在llvm source code目录下的tools\clang目录,否则会编不出来。
> cd /d c:\
> svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm_src
> cd llvm_src\tools
> svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
编译llvm及clang
接着要进行编译的动作:
> cd /d c:\llvm_src
> mkdir build
> cd build
> cmake.exe -DCLANG_BUILD_EXAMPLES=ON -DCMAKE_INSTALL_PREFIX=/llvm -G ”MinGW Makefiles” ..
> mingw32-make ENABLE_OPTIMIZED=1
安装
同样在c:\llvm_src\build的目录下输入下面的指令来安装:
> mingw32-make install
成功的话,就会发现在c:\llvm目录下面至少有以下的目录。基本上就代表llvm及clang已经成功安装了。
bin
docs
examples
include
lib
share
把c:\llvm\bin放到path的环境变量中,就可以进行编译了。为了方便,我做了一个批次档,并且将相关编译的工具环境当放入path中。
REM llvm-env.bat
set QTDIR=C:\Qt\SDK_1.1\Desktop\Qt\4.7.3\mingw
set PATH=C:\Qt\SDK_1.1\mingw\bin;%QTDIR%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem
set PATH=d:\llvm\bin;C:\Tools;C:\Program Files (x86)\CMake 2.8\bin;%PATH%
并且透过捷径的方式执行它,以得到命令视窗。
§ C:\Windows\System32\cmd.exe /A /Q /K c:\llvm\bin\llvm-env.bat
验证与练习
我们来准备一个简单的小程序来练习并且确认llvm与clang已经成功安装了
#include <stdio.h>
int main(int argc, char ** argv)
{
printf(“Hello World!\n”);
}
在刚刚准备好的命令视窗内输入clang的编译命令:
> clang -o myhello.exe hello.c -lmsvcrt -Ic:\qt\sdk_1.1\mingw\include -Lc:\qt\sdk_1.1\mingw\lib
因为我是直接使用Qt的mingw环境进行编译,所以就拿了Qt下面的include目录与lib目录来用。如果你是另外自己装mingw,记得修改这些目录以符合你的环境。
成功的话,会看到myhello.exe产出。执行它会在视窗内印出“Hello World!”的字样。
接着,我们来试试llvm相关的功能。首先,我们用clang来产出llvm的bitcode。
> clang -emit-llvm -o hello.bc -c hello.c -Ic:\qt\sdk_1.1\mingw\include
应该可以看到hello.bc这个bitcode档案出现。让我们透过lli用llvm的环境来执行它!
> lli hello.bc
然后,我们透过llvm-dis来反组译它。
> llvm-dis hello.bc -o hello.ll
可以看到hello.ll的内容如下。
; ModuleID = ’hello.bc’
target datalayout = ”e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32″
target triple = ”i686-pc-mingw32″
@.str = private unnamed_addr constant [14 x i8] c”Hello World!\0A\00″, align 1
define i32 @main(i32 %argc, i8** %argv) nounwind {
entry:
%retval = alloca i32, align 4
%argc.addr = alloca i32, align 4
%argv.addr = alloca i8**, align 4
store i32 0, i32* %retval
store i32 %argc, i32* %argc.addr, align 4
store i8** %argv, i8*** %argv.addr, align 4
%call = call i32 (i8*, …)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)) nounwind
%0 = load i32* %retval
ret i32 %0
}
declare i32 @printf(i8*, …) nounwind
到此为止,你成功的建立了一个确定可以工作的llvm与clang的环境囉!
参考资料: