前几天听说clang 3.4已经release了,然后我又手痒就折腾一下,在这里记录一下折腾的经过。

在以前就试过clang-cl+VC的开发环境,编译代码到是没发现什么大问题,有不少警告而已,不过clang不支持生成VC的pdb调试信息,导致生成的程序不能源码级调试,既然不能调试,那这个环境也没啥太大的实用价值了,于是就放弃了,又懒得自己编译MinGW版本的clang,就没继续折腾。这次官方发布3.4的时候直接放了MinGW版本的clang,正好方便了我这样的懒人,于是我就高高兴兴的做小白来进行测试了,步骤如下。

1.在这里下载了clang的windows版本

2.安装LLVM,安装完后直接把安装目录里面bin文件夹下的clang++.exe和clang.exe复制到mingw的bin文件夹下

3.打开一个命令提示符,把MinGW的bin目录添加到PATH环境变量中

4.顺手写了一个hello.c,内容大家都知道,一个printf

5.在命令提示符中CD到hello.c所在的文件夹,然后执行 clang -g -o hello.exe hello.c,结果报找不到头文件stdio.h

6.把便已命令改成了clang -g -o hello.exe -ID:\MinGW\include -ID:\MinGW\mingw32\lib\gcc\mingw32\4.8.1\include hello.c,加了两个包含目录,编译成功,hello.c也能正常执行。

7.执行gcc hello.exe,测试了下l(列出源码)、break(下断点)和r(执行)命令,执行的也很正常

到了这里,我很天真的以为没啥问题了,于是就开始找支持clang的IDE,google了一下听说CodeLite支持clang,于是就按照CodeLite的帮助文档进行配置,配置也很简单,下载了带TDM MinGW 4.7.1的CodeLite,然后把clang.exe和clang++.exe丢到自带的mingw的bin目录(我这里是D:\MinGW4.7.1\bin),又用CodeLite写了个hello word,编译运行调试都没啥问题,原以为到这里就应该结束了的,但是后面遇到了个问题让我折腾了一天。前面的hello world都是用的printf打印的,当我用std::cout<<"Hello word!"<<std::endl;测试的时候,发现运行到输出std::endl程序就会崩溃,尝试用static编译的也不行,我以为是TDM的GCC有问题,于是又换成了官方的MinGW,GCC版本为4.8.1的,问题依旧...接下来就是蛋疼的google问题解决问题的过程了。

最开始我猜测是不是官方编译的跟我的MinGW不兼容,要自己编译一下才好,于是我就自己下载了llvm clang和compiler-rt的源码进行编译,用4.7.1的GCC编译一路顺畅,没啥问题,但是编译出来的clang还是有问题;换4.8.1的gcc编译,遇到几个问题,第一个是在lto.h中有off_t没定义,明明包含了sys/type.h,但是可能是定义了_STRICT_ANSI_被跳过了,google了一顿只有这个比较靠谱,我也只好自己在文件开头加了个typedef _off_t off_t;,编译通过,但是问题依旧,编译的程序遇到std::endl就崩溃,搞的我也要崩溃了。google这个问题,但是我最开始关键字用的不对,一直没找到解决方法。无奈之下抄起IDA和OD,简单看了下应该是缺少this指针,也就是调用约定的问题。f**k,看样还是clang的问题,我可改不了clang的bug,还是要google。终于功夫不负有心人,让我在这里找到了解决方案,原来真是clang的bug,而且是从clang3.1时就有的bug,也不知道clang的开发人员干什么吃的,到现在也不解决,这个bug导致了clang不支持GCC 4.7往后的libstdc++(可能是改了之后就不支持4.7之前的libstdc++,不过难道clang的开发人员还在用那么老的gcc吗,郁闷),解决方法很简单,编辑clang/lib/AST/ItaniumCXXABI.cpp,找到这段代码:

CallingConv getDefaultMethodCallConv(bool isVariadic) const {
return CC_C;
}

把它修改成:

CallingConv getDefaultMethodCallConv(bool isVariadic) const {
if (!isVariadic && Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86)
return CC_X86ThisCall;
else
return CC_C;
}

然后保存,重新编译就行了。编译时还有些小错误,爱修改就修改不爱改就直接-i给pass掉了

编译完后测试了下,问题解决了。

下面写一下CodeLite的简单配置:

1.安装神马的

2.不用自带的MinGW,编辑CodeLite安装目录下的registry.ini,修改mingw的目录为你自己的MinGW的安装目录

3.复制编译好的clang.exe和clang++.exe带MinGW的bin目录下

4.打开CodeLite,点Settings-Build Settings,将clang和clang++的Advanced中的Include Path修改为D:\MinGW\lib\gcc\mingw32\4.8.1\include\c++;D:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32;D:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\backward;D:\MinGW\lib\gcc\mingw32\4.8.1\include;D:\MinGW\include;D:\MinGW\lib\gcc\mingw32\4.8.1\include-fixed;D:\MinGW\mingw32\include; 这里我的MinGW的安装路径为D:\MinGW。

5.打开Settings - Tags Settings,把CTags - Search paths和Clang - Search paths修改为:

d:\MinGW\lib\gcc\mingw32\4.8.1\include\c++
d:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32
d:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\backward
d:\MinGW\lib\gcc\mingw32\4.8.1\include
d:\MinGW\include
d:\MinGW\lib\gcc\mingw32\4.8.1\include-fixed
d:\MinGW\mingw32\include

不想用clang code completion的话,clang的可以不用设置

都是设置完了,测试了一下,貌似已经没啥问题了,奉上我编译的clang 3.4,然后就是截图留念:

http://www.godebug.org/index.php/archives/77/

在Windows上使用CodeLite+MinGW+Clang进行开发的更多相关文章

  1. Windows上安装QT4后更改MinGW的路径

    在windows上安装使用MinGW的QT4时,并不会一起安装MinGW. 在安装过程中,会让你指定已经安装的MinGW的路径. 当你使用QT4时,将使用你指定的MinGW的路径下的g++来编译构建程 ...

  2. 在windows上搭建C语言开发环境——借助eclipse和MinGW

    0. 前言     [本文目的]     近期在电脑上又一次安装了MinGW,发现MinGW的安装方法和之前的方法稍有差别,全部再写了一篇博文记录一下具体的安装方法.     [本文主要内容]     ...

  3. [ZZ] 在windows上编译Mesa3d opengl32库

    在windows上编译Mesa3d opengl32库 cheungmine http://blog.csdn.net/ubuntu64fan/article/details/8061475 Mesa ...

  4. Windows上Ruby开发环境的配置

    最近公司项目上有需要,需要开发一个puppet的自动化工具,这个工具需要操作存储设备上的各种资源,而鉴于puppet不是善于完成这个任务的首选语言,于是我们选择了puppet的“爹”,Ruby. 熟悉 ...

  5. 利用openssl管理证书及SSL编程第2部分:在Windows上编译 openssl

    利用openssl管理证书及SSL编程第2部分:在Windows上编译 openssl 首先mingw的环境搭建,务必遵循下文: http://blog.csdn.net/ubuntu64fan/ar ...

  6. 一步步实现windows版ijkplayer系列文章之六——SDL2源码分析之OpenGL ES在windows上的渲染过程

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  7. 在windows上构建LLVM 7.0.1

    关于在windows上构建LLVM,网上有不少文章,但都是互相抄来的,写作时极不认真,不是少这个,就是少那个,没有一篇是可以完整照着做下来的,实在气人. 本文的安装和配置过程,我亲自操作过好几遍,不惜 ...

  8. 关于WSL(Windows上的Linux子系统)的简单介绍及安装

    WSL,Windows Subsystem for Linux,就是之前的Bash on [Ubuntu on] Windows(嗯,微软改名部KPI++),在wsl环境下我们可以运行一些Linux程 ...

  9. mac与windows上部署使用Redis

    windows下Redis安装 在Redis的官网下载页上有各种各样的版本,由于redis官网不支持windows,但是我们伟大的windows家族还是召唤了一群小伙伴开发了win版的redis.要在 ...

随机推荐

  1. UVA 103 Stacking Boxes (dp + DAG上的最长路径 + 记忆化搜索)

     Stacking Boxes  Background Some concepts in Mathematics and Computer Science are simple in one or t ...

  2. apache .htaccess文件详解和配置技巧总结

    一..htaccess的基本作用 .htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令.       .htaccess主要的作用有:URL重写.自定义错误页面.MIME类 ...

  3. SQL查询各阶段的统计信息

            我们经常会遇到各种分类统计问题,须要将这些结果一次显示出来.这次老师提出的要求是我想看60分下面多少人.60~70多少人,70~80多少人.80~90多少人,90~100多少人.他们曾 ...

  4. c.Tom and paper

    Tom and paper Description There is a piece of paper in front of Tom, its length and width are intege ...

  5. 小猪猪逆袭成博士之C++基础篇(二) 常量、处理类型、自定义头文件

    小猪猪逆袭成博士之C++基础篇(二) const .auto. decltype 上一章我们介绍了一些常用的类型和常见的问题,下面再介绍一些学习的时候不是特别常用但是在实际工程中很有用的一些东西. 一 ...

  6. Win10玩魔兽争霸不能全屏显示的设置教程

    Win10玩魔兽争霸不能全屏显示的设置教程: 1.右击桌面左下角的windows图标,显示图片内容,然后点击运行: 2.点击运行,有个输入框,输入regedit,点击确认: 3.显示win10注册表, ...

  7. OpenGL ES 如何能看到一个物体内部和象3dmax中能只显示网格线

    上一篇 OpenGL ES 正反面设置指令 中分析了正反面的判区方法,那么正反面有什么用呢?接下来我们就要引入一个叫做背面消除的概念.在3dmax中有个选项,当你用挤压修改器挤出一个中空的长方体时,在 ...

  8. CentOS 6.5上安装MySQL-Cluster

    参考博文: CentOS 6.2下MySQL Cluster 7.2 配置数据库集群 CentOS 6.5上安装MySQL-Cluster 7.3.4过程笔记--下一步学习 MySQL Cluster ...

  9. Codeforces 486B - OR in Matrix

    矩阵的 OR ,也是醉了. 题目意思很简单,就是问你有没有这么一个矩阵,可以变化,得到输入的矩阵. 要求是这个矩阵每行都可以上下任意移动,每列都可以左右任意移动. 解题方法: 1.也是导致我WA 的原 ...

  10. ASP.NET MVC 5 学习教程:数据迁移之添加字段

    原文 ASP.NET MVC 5 学习教程:数据迁移之添加字段 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符 ...