LLVM/Clang On Windows 2013_09

好吧,好久没有写博客了,最近LLVM/Clang的主干版本取得了很大的进步,便在这里汇报下分析心得。 html

我很是建议研究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
c++

如何在Windows上构建LLVM/Clang,之前的博客有说过,目前在Windows上可以构建LLVM/Clang的有:
Visual Studio 2010
Visual Studio 2012 shell

Mingw Mingw64 Cygwin svn

特别指出,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.29
clang-cl cl基于clang
clang会根据名称实行多种模式。
  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 。能够说,有点复杂。一样也能够用: ui

#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

若是有更多问题请联系我 spa

若是要测试请下载ClangOnWin:https://sourceforge.net/projects/clangonwin/ .net

相关文章
相关标签/搜索