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/

  • 相关阅读:
    HashMap按键排序和按值排序
    LeetCode 91. Decode Ways
    LeetCode 459. Repeated Substring Pattern
    JVM
    LeetCode 385. Mini Parse
    LeetCode 319. Bulb Switcher
    LeetCode 343. Integer Break
    LeetCode 397. Integer Replacement
    LeetCode 3. Longest Substring Without Repeating Characters
    linux-网络数据包抓取-tcpdump
  • 原文地址:https://www.cnblogs.com/findumars/p/5464661.html
Copyright © 2011-2022 走看看