Windows下编译Clang
2015年01月07日 Windows

网上最近一直在说Clang这个编译器,说FreeBSD已完全使用Clang为默认编译器,Mac下也是这个编译器,“据说”编译速度比Gcc快出很多,生成出来的可执行文件也比Gcc生成的要小那么几个KB,还有错误提示也要友好很多,更还有各方“大家”对此嗤之以鼻。但是不管如何,做为一个喜欢瞎折腾的码农,不管各个大家是怎么说,自己一定要上手试试的。因为在Windows下没有Clang的二进制包,本着自己动手丰衣足食的原则,决定自己构建一个尝尝鲜(虽然这个’鲜’已然过去很久了), 其实构建过程很简单,官网上的getting started说得很明确了,这里也只是再用中文重复一下:

  1. svn的客户端,大多数都是直接使用TortoiseSVN,也就是那个“小乌龟”,用来check代码的,当然也可以直接去下source包。
  2. cmake,一个跨平台的makefile生成工具,可以生成不同平台的各种makefile或者project文件。
  3. vs2008或者vs2010,这个应该不用多说了,用windows的都知道。

三个工具安装好,并确保cmake的bin目录在path中,就可以开工了。

新建一个文件夹来放由svn检出的代码,比如d:/clang_llvm,之后用TortoiseSVN首先检出llvm的代码到llvm文件夹,然后再检出clang的代码到clang文件夹,再将clang文件夹全部移动到llvm下的tools文件夹下(TortoiseSVN)直接嵌入到右键菜单中,直接在clang_llvm文件夹中check out,填入链接和本地目录,OK即可)。完成后,回到clang_llvm文件夹下,此时文件夹中只有llvm目录,在clang_llvm下新建文件夹build。控制台进入到clang_llvm下的build目录下,执行如下命令:

如果是vs2008,则是:camke –G “Visual Studio 9 2008” ..\llvm

如果是vs2010,则是:cmake –G “Visual Studio 10” ..\llvm

如果运气不错,执行完毕后,生成LLVM.sln。使用vs打开这个解决方案。选择ALL_BUILD构建,漫长的等待…

完成后就可以在build/bin/Debug或者build/bin/Release文件下看到对应的类似clang.exe这样的生成文件了。将可执行文件所在目录加入path,就可以写一个test.c来测试一个clang了

1
clang –Wall test.c –o test

下面是一个测试的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main(int argc, char *argv[])
{
     for (int i = 0; i < 10; i++)
     {
           if (i == 2)
           {
        printf("%p\n", &i);
           }
           printf("%d\n", i + 1);
     }
     return 0;
}
1
2
gcc –Wall –std=c99 test.c –o test_gcc.exe
clang –Wall –std=c99 test.c –o test_clang.exe

编译均通过。下面是生成的可执行文件大小截图:

看起来clang生成的可执行文件的确比gcc生成的可执行文件要小,当然,这么一个小例子也说明不了什么。继续……

现在将源代码改出二个错误[一个算做逻辑错误,一个语法错误],如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main(int argc, char *argv[])
{
     for (int i = 0; i < 10; i++)
     {
           if (i = 2)//这里改为赋值
           {
               printf("%p\n", &i);
           }
           printf("%d\n", i + 1)//这里故意去掉了分号
         }
         return 0;
}

先看gcc的错误和警告提示截图[编译命令同上]:

gcc在第7行,也就是注释的第1行,给出了一个警告建议,第12行,也就是大括号前给出了一个语法错误提示。

下面再看clang的警告和错误提示截图[编译命令同上]:

clang这里给出的语法错误就比较直观了,直接能看到哪里出现了错误,定位到具体位置,而且针对“逻辑错误”,给出修改建议。当然这也只是一个小小的错误,也说明不了什么,码农的尝鲜clang就到此了^_*。