前言
筆者昨天檢視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
目錄
nanomsg 1.1.5
nanomsg是WonderTrader後來新增的訊息元件,封裝到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 7.70
curl是一個使用頻率非常高的庫,WonderTrader本身並不依賴curl
,但是易盛的交易API,筆者原來在對接外盤期貨的時候,有一個二次授權的機制,需要通過郵箱中轉二次授權碼,於是就用到了curl
。如果不需要使用易盛API,那麼實際上也不需要編譯curl
。WonderTrader使用的版本是7.70
。
curl
的編譯比較簡單,只需要進入到lib
目錄下,執行以下命令,靜等編譯結束即可$ mingw32-make -f Makefile.m32
- 編譯完以後,將
lib
目錄下的libcurl.a
複製到E:\mingw9deps\lib
目錄
dlfcn-win32 1.3.0
dlfcn在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配置
同樣,我們也可以在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...