博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LLVM/Clang On Windows 2013_09
阅读量:6802 次
发布时间:2019-06-26

本文共 3272 字,大约阅读时间需要 10 分钟。

  hot3.png

好吧,很久没有写博客了,最近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 2012

Mingw 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:

转载于:https://my.oschina.net/GIIoOS/blog/165542

你可能感兴趣的文章
js38---门面模式
查看>>
转:SharePoint Portal Server扩容部署
查看>>
libtiff库使用
查看>>
[转载]UML用例图总结
查看>>
《深度探索C++对象模型》调用虚函数
查看>>
“ORA-01747: user.table.column, table.column 或列说明无效” 的解决方案
查看>>
Python命令行解析argparse常用语法使用简介
查看>>
Lambda 表达式
查看>>
手把手教你用python抢票回家过年 !(附代码)
查看>>
SilverLight1.1 之旅(二):添加事件
查看>>
【转】Javascript MD5编码
查看>>
Java:集合类的区别详解
查看>>
linux 内核库函数 【转】
查看>>
asp.net 判断是否是日期格式,判断是否是长日期格式,短日期格式,时间判断,日期判断,全部格式...
查看>>
理解 OpenStack Swift (3):监控和一些影响性能的因素 [Monitoring and Performance]
查看>>
聚会留念
查看>>
iOS:在使用Cocoapods安装shareSDK时出现的link路径错误
查看>>
Asp.net防止页面被多次提交
查看>>
ASP.NET MVC5+EF6+EasyUI 后台管理系统(29)-T4模版
查看>>
敏捷的 "道"
查看>>