【作死之旅】clang + windows 10 + mingw64 + boost

提示:留下评论有助于加强我的快乐,会让我觉得自己所折腾的东西很有价值

最近脑袋一抽风,想从msvc转到clang,踩了无数个坑,耗时3天,终于把环境跑起来了,哈哈哈哈,虽然我还是不会抛弃msvc。

环境:Windows 10、clang 7.0、mingw64 8.1.0 x86_x64、boost 1.68.0

这个环境阵容绝对诚意满满,都是按照最新的环境来配置的。

首先到官网下载llvm和mingw64,我要配两个版本的环境,32和64的各要下载一个版本。为什么要准备两个版本?clang虽然支持交叉编译,但是mingw64不支持,mingw64有32位、64位两个版本,它是不能交叉编译的,也就是说32位的mingw64只能编译32位的程序,64位的mingw64也是一样。LLVM和mingw64的配置可以参考 

https://www.zhihu.com/question/30315894

OK,环境已经弄完了,接下来是一些很宝贵的工程经验,我踩了两天的坑得出来的。

首先要明白的是,clang是编译器系统的前端,后端使用的是llvm,clang做语法解析,llvm负责生成机器码,mingw64负责提供Windows的系统库。

但是这里有个很坑的地方,我不知道为什么clang 7.0 编译不了 boost 1.68.0,我试了一天的时间也没成功,经常报 error: cannot compile this non-trivial TLS destruction yet 错误。

绞尽脑汁,搜遍全网资料,好像没有任何一个人像我一样傻逼的在Windows下用clang + boost这个组合的,不得已放弃。在一段蹲坑的时间里,突然脑洞大开,然后回到电脑前先用mingw64(gcc)编译了boost 1.68,然后写了个demo测试,用clang编译的demo可以跟mingw64编译的boost库搭配起来无痛使用。

成功!

编译boost的命令行:

1、bootstrap gcc

2、b2 -j16 address-model=64 toolset=gcc stage

然后把.a文件和头文件,复制到mingw的目录就行了,这个大家自己琢磨一下该放哪里,很简单,我要写出来又很长很麻烦。

接着遇到一个问题,我不知道怎么链接boost的静态库,又查了两个多小时,编译代码时 clang 加上 -lboost_system-mgw81-mt-1_68(相应的库)就可以了。这个参数也很傻逼,也要说一下。如果一个库文件名字叫做 libabc.a,那么你的选项要写成 -labc;如果一个库的名字叫做libdashabi.a,那么这个选项就要写成-ldashabi,大家都能领悟其中的内涵的,也不多废话了。

 
64位的clang target:--target=x86_64-w64-mingw32
32位的clang target:--target=i686-w64-mingw32
 
配置mingw64时会很容易记住target的内涵,这个很好理解,然后这里还有一个坑。如果你选的mingw64是posix线程模型,请注意,这里你是没办法直接静态编译的,如果你想静态编译的话,要自己去折腾pthread相关的东西,具体我就暂时不深究了,因为我不需要静态编译,如果有人研究出来记得告诉我一声。如果你想直接静态编译exe,那么你要选择win32线程,但是使用win32线程模型也有个问题,就是没办法使用std::thread。
 
还有一个小瑕疵,就是clang的编译命令行传入的是单个代码文件。但是一个程序不可能只有一个cpp的,所以编译时传入的文件名改成:*.cpp。
 
OK,现在已经能用clang开玩基本的中型项目了。由于我弄的是客户端软件,我专门跑到XP SP3测试了一遍,mingw64生成的32位exe是可以跑在XP上的(前提是没用到XP之后的API),最大的牵挂也落地了。

猜你喜欢

转载自www.cnblogs.com/cnmlgb/p/10029992.html