文档章节

LLVM/Clang On Windows 2013_09

Force武装卫队
 Force武装卫队
发布于 2013/10/01 17:51
字数 1133
阅读 6156
收藏 21

好吧,很久没有写博客了,最近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.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 。可以说,有点复杂。同样也可以用:

#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://sourceforge.net/projects/clangonwin/

© 著作权归作者所有

Force武装卫队

Force武装卫队

粉丝 190
博文 40
码字总数 80436
作品 3
深圳
高级程序员
私信 提问
加载中

评论(16)

o
openav

引用来自“Force武装卫队”的评论

引用来自“openav”的评论

博主你好,我在win64位的系统下用vs2013自己编译了minsize版本的llvm+clang,在环境变量中配置了include和lib,我写了简单的hello,目前出现了这样的错误
F:\test>clang-cl 1.c
1-22ba35.obj : error LNK2019: 无法解析的外部符号 printf,该符号在函数 main 中被
引用
LINK : error LNK2001: 无法解析的外部符号 mainCRTStartup
1.exe : fatal error LNK1120: 2 个无法解析的外部命令
clang-cl.exe: error: linker command failed with exit code 1120 (use -v to see in
vocation)
这是为什么,是因为vs的运行库没有添加在环境变量中?不知道博主,你在clang编译完成后,怎么编译c和c++的,谢谢博主!
看了你这篇博文,我的理解事:vs2013编译的clang不能用msvcrt运行库编译c/c++,目前是不是是不是只能使用mingw库进行c/c++编译?我这个理解对不对?

@openav 要添加vc的环境变量 call vc的 环境变量脚本即可

引用来自“openav”的评论

谢谢博主的答复,我参考了你另一篇博文clang的环境变量配置,call "**/VsDevCmd.bat",但是我继续执行clang-cl 1.c 还是同样的问题。
我仔细看了一下你的博文,发现我们两在build clang时配置有点区别
我只有 llvm+clang,博主你的配置有llvm+clang+compiler-rt+lld+libcxx+extra,会是这些问题嘛?
还有这篇博文中这段话“特别指出,VisualStudio 2013暂时构建LLVM/Clang虽然能构建成功,但是Clang无法编译文件,这是clang内部支持没有更新,在clang的drive(WindowsToolChain.cpp)的源文件中,目前仍没有完善VS11的支持。而Cygwin64暂时无法通过编译,configure过程便已经失败。Mingw虽然都能编译,但高版本编译的clang的无法使用“应该怎么理解?

引用来自“Force武装卫队”的评论

这篇文章已经有几年了,目前可以使用 官方的二进制发行包或者使用 clangbuilder 构建,x64 位和 32位必须匹配 VisualC++ 的 x64 或者 x32
比如

@echo off
call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" amd64
echo.
echo VisualStudio 2015 Win64 Environment
echo.
Title Clang under Windows ^|x86_64-pc-windows-msvc
SET PATH=%PATH%;%~dp0bin;D:\Python\Python35
cmd /k

执行的时候可以指定 clang-cl -m64 hello.c
感谢博主的帮忙,已经编译成功,非常感谢👍
Force武装卫队
Force武装卫队 博主

引用来自“Force武装卫队”的评论

引用来自“openav”的评论

博主你好,我在win64位的系统下用vs2013自己编译了minsize版本的llvm+clang,在环境变量中配置了include和lib,我写了简单的hello,目前出现了这样的错误
F:\test>clang-cl 1.c
1-22ba35.obj : error LNK2019: 无法解析的外部符号 printf,该符号在函数 main 中被
引用
LINK : error LNK2001: 无法解析的外部符号 mainCRTStartup
1.exe : fatal error LNK1120: 2 个无法解析的外部命令
clang-cl.exe: error: linker command failed with exit code 1120 (use -v to see in
vocation)
这是为什么,是因为vs的运行库没有添加在环境变量中?不知道博主,你在clang编译完成后,怎么编译c和c++的,谢谢博主!
看了你这篇博文,我的理解事:vs2013编译的clang不能用msvcrt运行库编译c/c++,目前是不是是不是只能使用mingw库进行c/c++编译?我这个理解对不对?

@openav 要添加vc的环境变量 call vc的 环境变量脚本即可

引用来自“openav”的评论

谢谢博主的答复,我参考了你另一篇博文clang的环境变量配置,call "**/VsDevCmd.bat",但是我继续执行clang-cl 1.c 还是同样的问题。
我仔细看了一下你的博文,发现我们两在build clang时配置有点区别
我只有 llvm+clang,博主你的配置有llvm+clang+compiler-rt+lld+libcxx+extra,会是这些问题嘛?
还有这篇博文中这段话“特别指出,VisualStudio 2013暂时构建LLVM/Clang虽然能构建成功,但是Clang无法编译文件,这是clang内部支持没有更新,在clang的drive(WindowsToolChain.cpp)的源文件中,目前仍没有完善VS11的支持。而Cygwin64暂时无法通过编译,configure过程便已经失败。Mingw虽然都能编译,但高版本编译的clang的无法使用“应该怎么理解?
这篇文章已经有几年了,目前可以使用 官方的二进制发行包或者使用 clangbuilder 构建,x64 位和 32位必须匹配 VisualC++ 的 x64 或者 x32
比如

@echo off
call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" amd64
echo.
echo VisualStudio 2015 Win64 Environment
echo.
Title Clang under Windows ^|x86_64-pc-windows-msvc
SET PATH=%PATH%;%~dp0bin;D:\Python\Python35
cmd /k

执行的时候可以指定 clang-cl -m64 hello.c
o
openav

引用来自“Force武装卫队”的评论

引用来自“openav”的评论

博主你好,我在win64位的系统下用vs2013自己编译了minsize版本的llvm+clang,在环境变量中配置了include和lib,我写了简单的hello,目前出现了这样的错误
F:\test>clang-cl 1.c
1-22ba35.obj : error LNK2019: 无法解析的外部符号 printf,该符号在函数 main 中被
引用
LINK : error LNK2001: 无法解析的外部符号 mainCRTStartup
1.exe : fatal error LNK1120: 2 个无法解析的外部命令
clang-cl.exe: error: linker command failed with exit code 1120 (use -v to see in
vocation)
这是为什么,是因为vs的运行库没有添加在环境变量中?不知道博主,你在clang编译完成后,怎么编译c和c++的,谢谢博主!
看了你这篇博文,我的理解事:vs2013编译的clang不能用msvcrt运行库编译c/c++,目前是不是是不是只能使用mingw库进行c/c++编译?我这个理解对不对?

@openav 要添加vc的环境变量 call vc的 环境变量脚本即可
谢谢博主的答复,我参考了你另一篇博文clang的环境变量配置,call "**/VsDevCmd.bat",但是我继续执行clang-cl 1.c 还是同样的问题。
我仔细看了一下你的博文,发现我们两在build clang时配置有点区别
我只有 llvm+clang,博主你的配置有llvm+clang+compiler-rt+lld+libcxx+extra,会是这些问题嘛?
还有这篇博文中这段话“特别指出,VisualStudio 2013暂时构建LLVM/Clang虽然能构建成功,但是Clang无法编译文件,这是clang内部支持没有更新,在clang的drive(WindowsToolChain.cpp)的源文件中,目前仍没有完善VS11的支持。而Cygwin64暂时无法通过编译,configure过程便已经失败。Mingw虽然都能编译,但高版本编译的clang的无法使用“应该怎么理解?
Force武装卫队
Force武装卫队 博主

引用来自“openav”的评论

博主你好,我在win64位的系统下用vs2013自己编译了minsize版本的llvm+clang,在环境变量中配置了include和lib,我写了简单的hello,目前出现了这样的错误
F:\test>clang-cl 1.c
1-22ba35.obj : error LNK2019: 无法解析的外部符号 printf,该符号在函数 main 中被
引用
LINK : error LNK2001: 无法解析的外部符号 mainCRTStartup
1.exe : fatal error LNK1120: 2 个无法解析的外部命令
clang-cl.exe: error: linker command failed with exit code 1120 (use -v to see in
vocation)
这是为什么,是因为vs的运行库没有添加在环境变量中?不知道博主,你在clang编译完成后,怎么编译c和c++的,谢谢博主!
看了你这篇博文,我的理解事:vs2013编译的clang不能用msvcrt运行库编译c/c++,目前是不是是不是只能使用mingw库进行c/c++编译?我这个理解对不对?

@openav 要添加vc的环境变量 call vc的 环境变量脚本即可
o
openav
博主你好,我在win64位的系统下用vs2013自己编译了minsize版本的llvm+clang,在环境变量中配置了include和lib,我写了简单的hello,目前出现了这样的错误
F:\test>clang-cl 1.c
1-22ba35.obj : error LNK2019: 无法解析的外部符号 printf,该符号在函数 main 中被
引用
LINK : error LNK2001: 无法解析的外部符号 mainCRTStartup
1.exe : fatal error LNK1120: 2 个无法解析的外部命令
clang-cl.exe: error: linker command failed with exit code 1120 (use -v to see in
vocation)
这是为什么,是因为vs的运行库没有添加在环境变量中?不知道博主,你在clang编译完成后,怎么编译c和c++的,谢谢博主!
看了你这篇博文,我的理解事:vs2013编译的clang不能用msvcrt运行库编译c/c++,目前是不是是不是只能使用mingw库进行c/c++编译?我这个理解对不对?
Force武装卫队
Force武装卫队 博主

引用来自“YU_YU”的评论

引用来自“李博文”的评论

引用来自“YU_YU”的评论

clang cl.exe : error : no such file or directory: '/Ycstdafx.h'
这是什么原因呢?

/Yc stdafx.h? 可能是参数错误也可能是路径设置错误

我看邮件列表里有人提出来了

2013 确实没有支持到位
YU_YU
YU_YU

引用来自“李博文”的评论

引用来自“YU_YU”的评论

clang cl.exe : error : no such file or directory: '/Ycstdafx.h'
这是什么原因呢?

/Yc stdafx.h? 可能是参数错误也可能是路径设置错误

我看邮件列表里有人提出来了
YU_YU
YU_YU

引用来自“李博文”的评论

引用来自“YU_YU”的评论

clang cl.exe : error : no such file or directory: '/Ycstdafx.h'
这是什么原因呢?

/Yc stdafx.h? 可能是参数错误也可能是路径设置错误

应该是使用2013导致的,目前还没有支持吗?
Force武装卫队
Force武装卫队 博主

引用来自“YU_YU”的评论

clang cl.exe : error : no such file or directory: '/Ycstdafx.h'
这是什么原因呢?

/Yc stdafx.h? 可能是参数错误也可能是路径设置错误
YU_YU
YU_YU
clang cl.exe : error : no such file or directory: '/Ycstdafx.h'
这是什么原因呢?
LLVM 3.4 正式发布!

LLVM 3.4 已经释出,二进制下载已经准备就绪。 官方的邮件列表和首页,已经更新了3.4。 小伙伴还可以通过SVN方式或者GIT方式fork release分支的源码哦。 本次更新的邮件列表的原文如下: LL...

windyland
2014/01/06
4.9K
24
计算机的革命----编译器体系的战争-----集团军的危险信号

Symantec C/C++ 已经不见踪影,Symantec现在专心做他的安全软件,诺顿杀毒软件,还有一些其他的,Boland C/C++最后还是被收购了,现在的RAD C++ Builder混的一直不愠不火,WATCOM 被Sybase败...

Force武装卫队
2012/11/23
1K
9
Visual Studio 2012 Build Clang

不知道还有没有人记得Borland C/C++,C/C++四国圣战中的主角,换了老板 如今还在不冷不热的发展 ,支持Win32/Win64 OSX平台,即Embarcadero C++ Builder 现在支持Windows 64编程 最近试了一下...

Force武装卫队
2013/01/14
11K
24
cocos2d-x工程中,让xcode4.6能够使用C++11标准库

在Cocos2d-x的开发中,如果你使用的xcode4.6,有时候希望使用C++11标准库的东西,比如std::array,如果直接, include 将会出现无法找到array的问题。 这个时候我们就要对我们的xcode进行一下...

laiconglin
2013/11/07
3.7K
4
在Windows下面進行LLVM與CLANG的安裝

需要環境 本文假設你已經有下面的工具安裝在系統中,並且可以正確的使用。 SVN client (這是為了抓最新的llvm與clang的source code) cmake mingw32 用SVN下載source code 假設我們要將所有的...

红薯
2012/11/26
11.9K
6

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
今天
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
今天
6
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
9
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
5
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部