好吧,很久没有写博客了,最近LLVM/Clang的主干版本取得了很大的进步,便在这里汇报下分析心得。
我非常建议研究LLVM/Clang的朋友在自己电脑上安装TortoiseSVN 并且将LLVM的源代码Clone下来,LLVM的svn地址:http://llvm.org/svn/llvm-project/ 在这个页面有LLVM组织绝大部分项目的源代码。
克隆LLVM:svn co http://llvm.org/svn/llvm-project/llvm YourDir/LLVM克隆Clang:svn co http://llvm.org/svn/llvm-project/cfe YourDir/clang如何在Windows上构建LLVM/Clang,以前的博客有说过,目前在Windows上能够构建LLVM/Clang的有:
Visual Studio 2010 Visual Studio 2012Mingw Mingw64 Cygwin
特别指出,VisualStudio 2013暂时构建LLVM/Clang虽然能构建成功,但是Clang无法编译文件,这是clang内部支持没有更新,在clang的drive(WindowsToolChain.cpp)的源文件中,目前仍没有完善VS11的支持。而Cygwin64暂时无法通过编译,configure过程便已经失败。Mingw虽然都能编译,但高版本编译的clang的无法使用
一般情况下VisualStudio编译的clang速度要比Mingw编译的体积要小,反应速度快,所以我更倾向于使用VisualStudio 2012编译clang,在9月28日我将LLVM svn主干版本(3.4)的代码用VisualStudio构建一次,此次在LLVM源文件目录添加了 tools/clang tools/lld projects/libcxx tools/clang/tools/extra 用cmake-gui分别配置了 VisualStudio 11 已经VisualStudio 11(win64)两个解决方案,选择MinSizeRel(优化最好)编译完成后将bin下的MinSizeRel 改成Release lib下的MinSizeRel改成Release,用cpack跳转到项目目录,生成安装包。
LLVM安装包源目录呈下结构:
LLVM\ -----bin -----include -----lib -----msbuild-bin -----share -----tools 是不是很惊讶有msbuild-bin目录啊,目录下游cl.exe 而tools目录下也有msbuild 并且有Microsoft.Cpp.Win32.LLVM-vs2010.props Microsoft.Cpp.Win32.LLVM-vs2012.props 等文件,熟悉VisualStudio的都知道这是项目属性文件,与MSBuild VisualStudio IDE密切相关的,很明显,LLVM/Clang开始添加了VS IDE支持,不过,不要高兴得太早,经过大量测试,我发现一些问题:Clang 支持VisualStudio近况2013.09.29clang-cl cl基于clangclang会根据名称实行多种模式。 static const struct { const char *Suffix; const char *ModeFlag; } suffixes [] = { { "clang", 0 }, { "clang++", "--driver-mode=g++" }, { "clang-c++", "--driver-mode=g++" }, { "clang-cc", 0 }, { "clang-cpp", "--driver-mode=cpp" }, { "clang-g++", "--driver-mode=g++" }, { "clang-gcc", 0 }, { "clang-cl", "--driver-mode=cl" }, { "cc", 0 }, { "cpp", "--driver-mode=cpp" }, { "cl" , "--driver-mode=cl" }, { "++", "--driver-mode=g++" }, };clang 默认模式为0的是全支持,特别指出--drver-mode=cl 这种模式支持模拟Visual C++ cl.exe 并且在最近的svn主干版本支持VisualStudio IDE 对C的支持没有问题,编译C++则需要特定的参数;clang clang++(--driver-mode=g++ 使用Itanium C++ ABI)等能够编译C++程序,并且能够使用Visual C++的C++标准库文件,但是可能由于ABI的问题,无法链接,对不包含C++标准库的文件链接不存在问题。 关于wchar_t的支持,由于基于VisualStudio的Clang使用C Runtime ,所以支持 wmain wWinMain 但是需要指出,clang++ 编译C++程序 如果有wmain 会按照C++的ABI处理wmain 这就导致没有程序入口点,需要用extern "C" 在对应的函数前声明。这从一定程序上说明在Windows 上给予VisualStudio构建的clang用来开发C++程序依然是不建议的选择。最大特色,支持使用VisualStudio C++标准库文件,但由于Clang默认使用的是Itanium ABI ,而VisualStudio C++使用Microsoft ABI,名字改编的规则不一样,故链接时会出现错误。特别的clang-cl 也就是--driver-mode=cl 默认支持Microsoft C++ ABI 但是不支持RTTI所以需要添加 -D_HAS_EXCEPTIONS=0 /GR- 事实上clang都是一套代码,clang.exe clang++.exe clang-cl.exe cl.exe 文件的大小 HAS都是一致的,但是由于程序名字不相同,传入的argv[0]不同,驱动模型也是不同的。你可以去尝试一下改名后编译源文件测试。并且wmain wWinMain clang-cl 都是支持的,在 --driver-mode=0 的Suffix 可以添加--driver-mode 参数动态指定驱动模型
在Clang源代码目录 下lib\CodeGen 存在MicrosoftCXXABI.cpp;如果要使用clang支持VisualC++ C++标准库 要使用clang的clang-cl 或者是cl(即 "--driver-mode=cl") 并且需要使用/GR- -D_HAS_EXCEPTIONS=0 两个参数,即clang-cl -D_HAS_EXCEPTIONS=0 /GR- file.cpp 生成file.exe 。可以说,有点复杂。同样也可以用:
#If clang:clang --driver-mode=cl -D_HAS_EXCEPTIONS=0 /GR- file.cpp#If clang-cl.exe or cl.exe:clang-cl -D_HAS_EXCEPTIONS=0 /GR- file.cpp#cl -D_HAS_EXCEPTIONS=0 /GR- file.cpp
如果有更多问题请联系我
如果要测试请下载ClangOnWin: