MinGW環境編譯WonderTrader攻略

WonderTrader發表於2021-12-13

WonderTrader2.png

前言

筆者昨天檢視WonderTraderstar,居然已經有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下載
  • 選擇MinGW-w64-build並開啟
    選擇MinGW-w64-builds
  • 再跳轉到Sourceforge開始下載
    跳轉到Souceforge開始下載
  • 彈出的下載對話方塊選擇安裝檔案儲存的路徑
    開始下載MinGW-w64安裝程式
  • 下載完成以後,執行安裝程式
    執行安裝程式
  • 設定項要注意:執行緒模型Threads要選擇posix,否則編譯boost會失敗。然後點選"Next"開始下載
    配置選項
  • 安裝完成以後,開啟安裝木庫,雙擊執行mingw-w64.bat
    執行mingw-w64.bat
  • 在開啟的控制檯中,執行以下命令。如果顯示GCC的版本號,則MinGW環境安裝成功

    $ gcc -v

    測試gcc

三方庫編譯

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

    boost編譯

  • 編譯完以後,到stage/lib裡就可以看到生成的.a檔案了
    boost編譯
  • 最後將.a檔案的尾巴"-mgw81-mt-x64-1_72"去掉,複製到E:\mingw9deps\lib目錄

nanomsg 1.1.5

nanomsgWonderTrader後來新增的訊息元件,封裝到WtMsgQue模組中,作為WonderTrader以後依賴的核心訊息佇列元件。WonderTrader使用的版本是1.1.5,讀者可以自行下載,或者在共享雲盤裡下載。

  • 解壓以後,開啟CMakeLists.txt檔案
    開啟CMakeLists.txt
  • 按照如下截圖,將NN_STATIC_LIB改成ON,其他的項全部改成OFF
    修改配置選項
  • 使用cmake命令生成makefile

    $ cmake -G "MinGW Makefiles"

    執行cmake

  • 最後執行mingw32-make命令生成nanomsg
    生成nanomsg
  • 生成完以後,將libnanomsg.a複製到E:\mingw9deps\lib目錄

curl 7.70

curl是一個使用頻率非常高的庫,WonderTrader本身並不依賴curl,但是易盛的交易API,筆者原來在對接外盤期貨的時候,有一個二次授權的機制,需要通過郵箱中轉二次授權碼,於是就用到了curl。如果不需要使用易盛API,那麼實際上也不需要編譯curlWonderTrader使用的版本是7.70

  • curl的編譯比較簡單,只需要進入到lib目錄下,執行以下命令,靜等編譯結束即可

    $ mingw32-make -f Makefile.m32

    編譯libcurl

  • 編譯完以後,將lib目錄下的libcurl.a複製到E:\mingw9deps\lib目錄

dlfcn-win32 1.3.0

dlfcnLinux下是內建的,即dl模組。但是dl模組在MinGW環境不是內建的,所以需要單獨編譯dlfcnWindows下的實現。

  • 編寫config.mak檔案

    BUILD_STATIC=yes
    CC=gcc
    AR=ar
    RANLIB=ranlib

    編寫config

  • 執行mingw32-make命令進行編譯
    編譯dlfcn
  • 將生成的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原始碼目錄srcClion會自動解析CMakeLists.txt作為一個解決方案
    開啟WonderTrader工程
  • File選單下選擇Setting進行配置,在彈窗中選擇配置ToolchainsClion會自動掃描MinGW環境。如果MinGW不是預設,則將其移動到第一個,設定為預設,這樣編譯的時候才會呼叫MinGW的編譯環境。
    配置Toolchains
  • 然後在CMake選項卡中配置編譯模式,預設為Debug
    CMake配置項
  • 完成上述設定之後,選擇Build選單裡的Build Project命令,就開始生成整個工程了
    Build Project
    Clion編譯完成

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倍以上。
  • GCCWindows下連結的時候,還是要檢查依賴項是否全部都連結成功了,這樣可以在編譯期間就發現一些依賴庫相關的問題。
  • 總之,筆者還是不建議大家在MinGW的環境編譯WonderTrader,畢竟MSVC用起來並不差。

結束語

WonderTrader開源以來大概有20個月了,筆者非常高興有越來越多的人關注WonderTrader、使用WonderTrader,還有越來越多的人蔘與到WonderTrader的改進過程中,筆者也通過WonderTrader認識了很多新朋友。
最近也有不少朋友問我WonderTrader商業化的規劃,筆者其實並沒有想太多。WonderTrader就是一個開源專案,而且是一個已經進行大規模實盤的量化平臺,核心部分是非常穩定的。WonderTrader以後完善的方向是應用場景的擴充,很難再進行核心部分的重構了。所以筆者覺得,大家不應該擔心WonderTrader如果商業化會不會侵蝕開源部分的功能,因為WonderTrader的核心已經毫無保留了。

最後再來一波廣告

WonderTradergithub地址:https://github.com/wondertrad...

WonderTrader官網地址:https://wondertrader.github.io

wtpygithub地址:https://github.com/wondertrad...


WonderTrader2.png

相關文章