MinGW环境编译WonderTrader攻略

MinGW环境编译WonderTrader攻略
文章图片

前言
笔者昨天查看WonderTrader的star,居然已经有400+了,实在有点出乎笔者的意料,毕竟WonderTrader从没有正式推广过。笔者在这里要向在不同场合向其他人介绍过WonderTrader的每一位朋友,都表示诚挚的感谢!
从WonderTrader开源到现在,因为各种原因,Linux下的测试一直都是没有跟上的。加上笔者在Linux下开发的经验有限,所以Linux下的版本留存了很多问题。而Linux下使用gcc编译,在链接的时候,并不会检查是否所有的符号都链接成功了,从而导致很多问题只能在运行的时候才能检查出来。
刚好最近有一位朋友想将wtpy改一版cython版本的wtcy,需要在mingw环境下编译一些对接的模块,也对底层的适配有一些要求。很早之前也有用户向笔者提出过Clion编译的需求,但是当时笔者因为工作比较忙,并没有推进。
前段时间笔者就趁此机会,把跨平台编译相关的代码全部梳理了一遍。于是就有了《MinGW环境编译WonderTrader攻略》这篇文章。
本文的主要内容就是介绍Windows下使用MinGW编译WonderTrader源码的流程。
MinGW-w64环境准备
首先要安装的是MinGW-w64

  • MinGW-w64官网,点击下载
    MinGW环境编译WonderTrader攻略
    文章图片
  • 选择MinGW-w64-build并打开
    MinGW环境编译WonderTrader攻略
    文章图片
  • 再跳转到Sourceforge开始下载
    MinGW环境编译WonderTrader攻略
    文章图片
  • 弹出的下载对话框选择安装文件存储的路径
    MinGW环境编译WonderTrader攻略
    文章图片
  • 下载完成以后,运行安装程序
    MinGW环境编译WonderTrader攻略
    文章图片
  • 设置项要注意:线程模型Threads要选择posix,否则编译boost会失败。然后点击"Next"开始下载
    MinGW环境编译WonderTrader攻略
    文章图片
  • 安装完成以后,打开安装木库,双击运行mingw-w64.bat
    MinGW环境编译WonderTrader攻略
    文章图片
  • 在打开的控制台中,执行以下命令。如果显示GCC的版本号,则MinGW环境安装成功
    $ gcc -v

    MinGW环境编译WonderTrader攻略
    文章图片

三方库编译
WonderTrader虽然已经尽量做到的减少依赖,但是还是有一些必不可少的依赖库。笔者之前一直在共享网盘里提供了vs2017ubuntu18.04centos7以及centos8的预编译依赖库。但是MinGW是一个新的编译环境,所以依赖库还是要重新编译的。
笔者一贯的风格是:三方库能用静态链接,绝不动态链接。这样的好处是,最终的发布包不需要那么多额外的动态库,坏处就是编译的最终文件比较大。下面介绍的编译的方法都是输出静态库。
在编译之前,要和MSVC的编译环境一样,需要新建一个环境变量MyDependsGcc,并将值设置为依赖库的保存目录,如E:\mingw9deps。include子目录可以直接拷贝MSVC依赖库的include目录,lib子目录下的.a库文件就需要按照下面介绍的步骤编译生成了。
编译boost 1.72.0 boost库对于C++开发者的重要性不用我多说,boost的编译实际上是比较方便的。WonderTrader依赖的版本是1.72.0
  • 首先运行bootstrap.bat,会自动生成一个b2.exe程序。
  • 然后在boost目录下执行命令行
    $ b2.exe --build-type=minimal --with-chrono --with-date_time --with-filesystem --with-regex --with-thread toolset=gcc architecture=x86 address-model=64 variant=release link=static threading=multi stage

    MinGW环境编译WonderTrader攻略
    文章图片

  • 编译完以后,到stage/lib里就可以看到生成的.a文件了
    MinGW环境编译WonderTrader攻略
    文章图片
  • 最后将.a文件的尾巴"-mgw81-mt-x64-1_72"去掉,复制到E:\mingw9deps\lib目录
nanomsg 1.1.5 nanomsg是WonderTrader后来新增的消息组件,封装到WtMsgQue模块中,作为WonderTrader以后依赖的核心消息队列组件。WonderTrader使用的版本是1.1.5,读者可以自行下载,或者在共享云盘里下载。
  • 解压以后,打开CMakeLists.txt文件
    MinGW环境编译WonderTrader攻略
    文章图片
  • 按照如下截图,将NN_STATIC_LIB改成ON,其他的项全部改成OFF
    MinGW环境编译WonderTrader攻略
    文章图片
  • 使用cmake命令生成makefile
    $ cmake -G "MinGW Makefiles"

    MinGW环境编译WonderTrader攻略
    文章图片

  • 最后执行mingw32-make命令生成nanomsg
    MinGW环境编译WonderTrader攻略
    文章图片
  • 生成完以后,将libnanomsg.a复制到E:\mingw9deps\lib目录
curl 7.70 curl是一个使用频率非常高的库,WonderTrader本身并不依赖curl,但是易盛的交易API,笔者原来在对接外盘期货的时候,有一个二次授权的机制,需要通过邮箱中转二次授权码,于是就用到了curl。如果不需要使用易盛API,那么实际上也不需要编译curl。WonderTrader使用的版本是7.70
  • curl的编译比较简单,只需要进入到lib目录下,执行以下命令,静等编译结束即可
    $ mingw32-make -f Makefile.m32

    MinGW环境编译WonderTrader攻略
    文章图片

  • 编译完以后,将lib目录下的libcurl.a复制到E:\mingw9deps\lib目录
dlfcn-win32 1.3.0 dlfcn在Linux下是内置的,即dl模块。但是dl模块在MinGW环境不是内置的,所以需要单独编译dlfcnWindows下的实现。
  • 编写config.mak文件
    BUILD_STATIC=yes CC=gcc AR=ar RANLIB=ranlib

    MinGW环境编译WonderTrader攻略
    文章图片

  • 执行mingw32-make命令进行编译
    MinGW环境编译WonderTrader攻略
    文章图片
  • 将生成的libdl.a复制到E:\mingw9deps\lib目录,将dlfcn.h复制到E:\mingw9deps\include目录
预编译库下载 前面介绍完各个依赖库的编译方法,笔者也提供了预编译的包,大家可以根据需要自行下载。
MinGW环境编译WonderTrader攻略
文章图片

共享网盘链接:
https://pan.baidu.com/s/1Bdxh...
提取码:d6bh
Clion+MinGW配置
Clion是最近几年流行起来的IDE,由JetBrains公司提供。近些年有很多人开始使用Clion开发C++程序。下面笔者就大致介绍一下Clion如何配置MinGW编译环境来编译WonderTrader。
Clion的安装流程,笔者在这里就不再赘述了。值得一提的是,Clion虽然是一个收费的商业软件,但是为开源项目参与者提供了免费的账户,笔者也是通过这样的方式申请到的免费账号。
  • 打开WonderTrader源码目录srcClion会自动解析CMakeLists.txt作为一个解决方案
    MinGW环境编译WonderTrader攻略
    文章图片
  • File菜单下选择Setting进行配置,在弹窗中选择配置ToolchainsClion会自动扫描MinGW环境。如果MinGW不是默认,则将其移动到第一个,设置为默认,这样编译的时候才会调用MinGW的编译环境。
    MinGW环境编译WonderTrader攻略
    文章图片
  • 然后在CMake选项卡中配置编译模式,默认为Debug
    MinGW环境编译WonderTrader攻略
    文章图片
  • 完成上述设置之后,选择Build菜单里的Build Project命令,就开始生成整个工程了
    MinGW环境编译WonderTrader攻略
    文章图片

    MinGW环境编译WonderTrader攻略
    文章图片
VSCode+MinGW配置
同样,我们也可以在VSCode中使用MinGW编译WonderTrader。
  • 首先我们需要在VSCode中安装几个必要的插件,如下图。CMake Tools是一个核心的插件,后面编译和配置的调用方法都是由这个插件提供的。
    MinGW环境编译WonderTrader攻略
    文章图片
  • 插件安装完成以后,会在状态栏出现一个操作按钮。首先需要选择编译组件,如下图:
    MinGW环境编译WonderTrader攻略
    文章图片
  • 选择好编译组件以后,则配置编译模式是Debug还是Release
    MinGW环境编译WonderTrader攻略
    文章图片
  • 最后点击"Build"按钮,开始构建整个项目
    MinGW环境编译WonderTrader攻略
    文章图片

    MinGW环境编译WonderTrader攻略
    文章图片
一些心得
前面关于MinGW环境下编译WonderTrader的攻略看起来并不难,实际上也是如此。WonderTrader原来很多代码在跨平台兼容性上有一些问题,所以笔者在折腾的时候就显得非常狼狈了,不过同时笔者也学到了不少东西。
  • 比如原来Windows下只用MSVC开发,而GCC编译器只在Linux上使用,那么代码中很多条件编译指令如:
    #IF _WIN32 //... #ELSE _UNIX //... #ENDIF

    在原来WonderTrader中是可以等价于:
    #IF _MSC_VER //... #ELSE _GNUC //... #ENDIF

    这次重新梳理以后,编译器相关的条件编译和平台相关的条件编译就彻底区分开了。
  • GCC编译出来的目标文件相比MSVC编译出来的目标文件要大很多。笔者估计MinGW毕竟是模拟的Linux环境,不能直接引用Windows内置的模块,所以很多依赖必须要全部编译到目标文件中。
  • MinGW编译速度相比MSVC来说慢了不少,花费时间基本上是MSVC编译的2倍以上。
  • GCCWindows下链接的时候,还是要检查依赖项是否全部都链接成功了,这样可以在编译期间就发现一些依赖库相关的问题。
  • 总之,笔者还是不建议大家在MinGW的环境编译WonderTrader,毕竟MSVC用起来并不差。
结束语
WonderTrader开源以来大概有20个月了,笔者非常高兴有越来越多的人关注WonderTrader、使用WonderTrader,还有越来越多的人参与到WonderTrader的改进过程中,笔者也通过WonderTrader认识了很多新朋友。
最近也有不少朋友问我WonderTrader商业化的规划,笔者其实并没有想太多。WonderTrader就是一个开源项目,而且是一个已经进行大规模实盘的量化平台,核心部分是非常稳定的。WonderTrader以后完善的方向是应用场景的拓展,很难再进行核心部分的重构了。所以笔者觉得,大家不应该担心WonderTrader如果商业化会不会侵蚀开源部分的功能,因为WonderTrader的核心已经毫无保留了。
最后再来一波广告
WonderTrader的github地址:https://github.com/wondertrad...
WonderTrader官网地址:https://wondertrader.github.io
wtpy的github地址:https://github.com/wondertrad...
【MinGW环境编译WonderTrader攻略】MinGW环境编译WonderTrader攻略
文章图片

    推荐阅读