zoukankan      html  css  js  c++  java
  • 在Windows上使用CodeLite+MinGW+Clang进行开发

    前几天听说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:MinGWinclude -ID:MinGWmingw32libgccmingw324.8.1include 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.1in),又用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:MinGWlibgccmingw324.8.1includec++;D:MinGWlibgccmingw324.8.1includec++mingw32;D:MinGWlibgccmingw324.8.1includec++ackward;D:MinGWlibgccmingw324.8.1include;D:MinGWinclude;D:MinGWlibgccmingw324.8.1include-fixed;D:MinGWmingw32include; 这里我的MinGW的安装路径为D:MinGW。

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

    d:MinGWlibgccmingw324.8.1includec++
    d:MinGWlibgccmingw324.8.1includec++mingw32
    d:MinGWlibgccmingw324.8.1includec++ackward
    d:MinGWlibgccmingw324.8.1include
    d:MinGWinclude
    d:MinGWlibgccmingw324.8.1include-fixed
    d:MinGWmingw32include

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

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

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

  • 相关阅读:
    文件操作工具类
    批量插入数据到 MySQL的几种方式
    C#队列学习笔记:RabbitMQ使用多线程提高消费吞吐率
    C#队列学习笔记:RabbitMQ延迟队列
    C#队列学习笔记:RabbitMQ优先级队列
    C#队列学习笔记:RabbitMQ实现客户端相互通讯
    C#队列学习笔记:RabbitMQ搭建集群
    C#队列学习笔记:RabbitMQ安装及使用
    C#队列学习笔记:RabbitMQ基础知识
    C#队列学习笔记:MSMQ入门二
  • 原文地址:https://www.cnblogs.com/findumars/p/5464661.html
Copyright © 2011-2022 走看看