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-w64-build
并打开
文章图片
- 再跳转到
Sourceforge
开始下载
文章图片
- 弹出的下载对话框选择安装文件存储的路径
文章图片
- 下载完成以后,运行安装程序
文章图片
- 设置项要注意:线程模型
Threads
要选择posix
,否则编译boost
会失败。然后点击"Next"开始下载
文章图片
- 安装完成以后,打开安装木库,双击运行
mingw-w64.bat
文章图片
- 在打开的控制台中,执行以下命令。如果显示
GCC
的版本号,则MinGW
环境安装成功
$ gcc -v
文章图片
WonderTrader虽然已经尽量做到的减少依赖,但是还是有一些必不可少的依赖库。笔者之前一直在共享网盘里提供了
vs2017
、ubuntu18.04
、centos7
以及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
文章图片
- 编译完以后,到
stage/lib
里就可以看到生成的.a
文件了
文章图片
- 最后将
.a
文件的尾巴"-mgw81-mt-x64-1_72"去掉,复制到E:\mingw9deps\lib
目录
WtMsgQue
模块中,作为WonderTrader以后依赖的核心消息队列组件。WonderTrader使用的版本是1.1.5
,读者可以自行下载,或者在共享云盘里下载。- 解压以后,打开
CMakeLists.txt
文件
文章图片
- 按照如下截图,将NN_STATIC_LIB改成ON,其他的项全部改成OFF
文章图片
- 使用
cmake
命令生成makefile
$ cmake -G "MinGW Makefiles"
文章图片
- 最后执行
mingw32-make
命令生成nanomsg
文章图片
- 生成完以后,将
libnanomsg.a
复制到E:\mingw9deps\lib
目录
curl
,但是易盛的交易API,笔者原来在对接外盘期货的时候,有一个二次授权的机制,需要通过邮箱中转二次授权码,于是就用到了curl
。如果不需要使用易盛API,那么实际上也不需要编译curl
。WonderTrader使用的版本是7.70
。curl
的编译比较简单,只需要进入到lib
目录下,执行以下命令,静等编译结束即可
$ mingw32-make -f Makefile.m32
文章图片
- 编译完以后,将
lib
目录下的libcurl.a
复制到E:\mingw9deps\lib
目录
Linux
下是内置的,即dl
模块。但是dl
模块在MinGW
环境不是内置的,所以需要单独编译dlfcn
在Windows
下的实现。- 编写
config.mak
文件
BUILD_STATIC=yes CC=gcc AR=ar RANLIB=ranlib
文章图片
- 执行
mingw32-make
命令进行编译
文章图片
- 将生成的
libdl.a
复制到E:\mingw9deps\lib
目录,将dlfcn.h
复制到E:\mingw9deps\include
目录
文章图片
共享网盘链接:
https://pan.baidu.com/s/1Bdxh...
提取码:d6bh
Clion+MinGW配置
Clion是最近几年流行起来的
IDE
,由JetBrains
公司提供。近些年有很多人开始使用Clion
开发C++
程序。下面笔者就大致介绍一下Clion
如何配置MinGW
编译环境来编译WonderTrader。Clion
的安装流程,笔者在这里就不再赘述了。值得一提的是,Clion
虽然是一个收费的商业软件,但是为开源项目参与者提供了免费的账户,笔者也是通过这样的方式申请到的免费账号。- 打开WonderTrader源码目录
src
,Clion
会自动解析CMakeLists.txt
作为一个解决方案
文章图片
File
菜单下选择Setting
进行配置,在弹窗中选择配置Toolchains
。Clion
会自动扫描MinGW
环境。如果MinGW
不是默认,则将其移动到第一个,设置为默认,这样编译的时候才会调用MinGW
的编译环境。
文章图片
- 然后在
CMake
选项卡中配置编译模式,默认为Debug
文章图片
- 完成上述设置之后,选择
Build
菜单里的Build Project
命令,就开始生成整个工程了
文章图片
文章图片
同样,我们也可以在
VSCode
中使用MinGW
编译WonderTrader。- 首先我们需要在
VSCode
中安装几个必要的插件,如下图。CMake Tools
是一个核心的插件,后面编译和配置的调用方法都是由这个插件提供的。
文章图片
- 插件安装完成以后,会在状态栏出现一个操作按钮。首先需要选择编译组件,如下图:
文章图片
- 选择好编译组件以后,则配置编译模式是
Debug
还是Release
文章图片
- 最后点击"
Build
"按钮,开始构建整个项目
文章图片
文章图片
前面关于
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倍以上。GCC
在Windows
下链接的时候,还是要检查依赖项是否全部都链接成功了,这样可以在编译期间就发现一些依赖库相关的问题。- 总之,笔者还是不建议大家在
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攻略】
文章图片
推荐阅读
- 人生感悟记#环境仪器宋庆国成长记#072
- 六步搭建ES6语法环境
- iOS,打Framework静态库
- win10环境|win10环境 python3.6安装pycrypto-2.6.1的问题
- 《Unix网络编程》第一卷第三版|《Unix网络编程》第一卷第三版 源码编译
- maven使用tomcat7插件编译jsp出错
- 嵌入式(编译内核、根文件系统等)
- Python|Win10下 Python开发环境搭建(PyCharm + Anaconda) && 环境变量配置 && 常用工具安装配置
- 为Google|为Google Cloud配置深度学习环境(CUDA、cuDNN、Tensorflow2、VScode远程ssh等)
- 读《12条生活规则》,在噪杂混乱的环境里找到生活的目的和意义