當前位置: 華文星空 > 知識

用CLion和CMake搭建DolphinDB外掛程式開發環境

2021-12-01知識

本文以window 10為例,介紹了如何用CLion和CMake搭建DolphinDB外掛程式開發環境,然後結合例項講解如何用CLion偵錯外掛程式程式碼,以幫助初學者快速入門DolphinDB外掛程式開發。Clion能Attach DolphinDB節點行程並用圖形界面進行偵錯,相比gdb的命令列偵錯,簡單友好,大大降低了開發者偵錯DolphinDB外掛程式的難度。

1 環境準備

1.1 安裝和配置MinGW

MinGW中包含gcc,g++等多種編譯器,可從其官網下載,下載時請選擇 x86_64-posix-seh 版本(posix表示啟用了C++ 11 多執行緒特性,seh表示異常分支處理零開銷,以與DolphinDB server保持一致),然後手動添加環境變量。下載地址:

為節省篇幅,具體的安裝細節請參閱:windows下安裝mingw-w64 - tnnmigga - 網誌園 。

  • 解壓時盡量解壓在某個盤的根目錄。
  • 將MinGW下bin目錄的路徑添加到環境變量中。
  • 驗證是否配置成功,按win+r執行cmd或者powershell輸入gcc -v,出現如下圖所示版本資訊即表明MinGW安裝成功,否則需要再檢查一下。
  • 避坑指南:我曾下載安裝x86_64-posix-sjlj 版本,編譯某些外掛程式比如DolphinDB官網上的mqtt外掛程式成功,但載入外掛程式失敗,提示:The specified module could not be found。因此碰到這種錯誤時,請檢查MinGW的版本是不是x86_64-posix-seh版本。

    1.2 安裝CMAKE

    下載連結: https:// cmake.org/download/

    選擇一個字尾為.msi的安裝包下載,如下圖劃線所示:

    下載後雙擊安裝,安裝時記得勾選「Add CMake to the system PATH for all users」,這樣就不用自己再配置環境變量了。

    安裝後按win+r執行cmd或者powershell輸入cmake -v,出現如下圖所示版本資訊即表明安裝成功:

    1.3 CLion安裝

    下載連結:https://www. jetbrains.com/clion/dow nload

    選擇windows .exe下載,下載後滑鼠雙擊CLion-2021.2.3.exe(我下載的版本是2021.2.3,版本不同,檔名相應而變),然後一路點選Next即可完成安裝,非常簡單。

    安裝後,開啟CLion,進入下圖點選Activate CLion輸入啟用碼,或點選Start trial開始試用。CLion是收費軟件,可以點選下圖中的Buy license購買啟用碼,若是教師或學生,可以申請Free Educational Licenses免費使用。

    1.4 安裝Git

    下載連結:Git - Downloading Package

    下載後雙擊一路預設安裝即可,在cmd中執行git --version,顯示如下圖所示版本資訊即表明安裝成功。

    1.5 部署DolphinDB集群和客戶端軟件

    若本機沒有部署DolphinDB節點和GUI客戶端。請按單節點部署教程部署和啟動一個單節點,版本選擇目前最新版1.30.14版本。GUI請從官網下載頁面的 其它資源下載 列表第一個連結獲取GUI的安裝包,並按客戶端軟件教程和啟動。

    2 下載外掛程式程式碼

    外掛程式程式碼連結:dolphindb/DolphinDBPlugin

    其中的include子目錄包含了DolphinDB的核心數據結構的類別宣告和一些工具類別宣告,這些類是實作外掛程式的重要基礎工具。其他子目錄如odbc與mysql等包含了ODBC與MySQL等各外掛程式的源碼,在我們寫外掛程式時可參考它們的實作方法。

    如下圖所示,在cmd中執行git clone -b release130 https:// gitee.com/dolphindb/Dol phinDBPlugin.git 即可下載。

    註意:外掛程式分支應與DolphinDB Server的版本相匹配,即若DolphinDB Server是1.30版本,外掛程式套用release130分支,若DolphinDB Server是2.00版本,外掛程式應該用release200分支,其他版本依此類推。

    3 編寫一個外掛程式

    3.1 案例需求

    匯入二進制格式的level2股票行情檔到數據庫中,這些股票行情數據檔有個特點,就是每個檔中包含:快照、逐筆成交和逐筆委托三種類別數據,我們需要把不同類別的數據分別倒入不同的表中。檔儲存格式如下:

    struct zb_tick { int type; union { struct ss_quote hq; struct ss_transaction ts; struct ss_order_onebyone o_one; } data; };

    其中type為0時,表示快照數據,type為2時表示逐筆成交數據,type為3時表示逐筆委托數據。具體格式參見

    cy_struct.h
    6.8K
    ·
    百度網盤

    樣本數據檔參見

    600519.SH.dat
    30.9M
    ·
    百度網盤

    3.2 編寫外掛程式格式檔

    3. 2.1 基本概念

    外掛程式函數分運算子函數(operator function)和系統函數(system function)2種類別,區別在於,前者接受的參數個數小於等於2,而後者可以接受任意個參數,並支持會話的存取操作。

    開發一個運算子函數,需要編寫一個原型為 ConstantSP (const ConstantSP& a, const ConstantSP& b) 的C++函數。當函數參數個數為2時,a 和 b 分別為外掛程式函數的第一和第二個參數;當參數個數為1時,b 是一個占位符,沒有實際用途;當沒有參數時,a 和 b 均為占位符。

    開發一個系統函數,需要編寫一個原型為 ConstantSP (Heap* heap, vector& args) 的C++函數。使用者在DolphinDB中呼叫外掛程式函數時傳入的參數,都按順序保存在C++的向量 args 中。heap 參數不需要使用者傳入。

    函數原型中的 ConstantSP 可以表示絕大多數DolphinDB物件(純量、向量、矩陣、表,等等)。其他常用的衍生自它的變量類別有 VectorSP(向量)以及 TableSP(表)等。

    3.2.2 格式要求

    DolphinDB使用一個文字檔案來描述外掛程式。該檔格式如下:首行描述外掛程式名字和共享庫檔名,其後每一行都描述一個共享庫函數和DolphinDB函數的對映關系。

    module name, lib file function name in lib, function name in DolphinDB, function type, minParamCount, maxParamCount, isAggregate

    其中:

  • module name: 表示模組名
  • lib file: 表示共享檔庫檔名
  • function name in lib: 表示共享庫中匯出的函數名
  • function name in DolphinDB: 表示DolphinDB中的對應函數名
  • function type: 表示operator或者system函數類別
  • minParamCount: 最少參數個數
  • maxParamCount:最多參數個數
  • isAggregate: 是否為聚合函數
  • 3.2.3 案例格式設計

    格式檔內容如下:

    loadBinaryQuotes,libPluginLoadBinQuotes.dll getTables,loadBin,system,1,1,0

    即設計模組名為loadBinaryQuotes,共享檔庫檔名為libPluginLoadBinQuotes.dll(若linux下為libPluginLoadBinQuotes.so),共享庫中匯出的函數名為getTables,DolphinDB中的對應函數名為loadBin,此函數為系統函數,參數為1個,非聚合函數。

    3.3 用CLion建立工程

    步驟1.先在建立DolphinDBPlugin目錄下建立loadBinaryQuotes子目錄,把3.2節設計的格式檔放到這個子目錄下,並建立一個子目錄src用於存放原始碼檔,把3.1節提到的cy_struct.h放到src目錄下。

    步驟2. 開啟CLion,點選New project,然後選擇在左側欄選擇C++ Library,在右欄輸入如下:

    在上圖中輸入完成後,點選右下角的Create,這時會彈出一個對話方塊說目錄下非空,選擇Create from Existing Sources即可。

    這時CLion會生成工程如下圖:

    它自動生成了library.h/.cpp和CMakeLists.txt。如果我們點選選單Build/Build Project,是能編譯成功的。但這裏我們不要library.h/.cpp,所以選中它們,點滑鼠右鍵,delete它們。然後在src目錄下添加2檔export.h和export.cpp。

    export.h主要用於匯出動態庫的函數,主要內容如下:

    extern "C" ConstantSP getTables(Heap *heap, vector<ConstantSP> &args);

    export.cpp主要用於實作外掛程式函數getTables。兩個檔具體參見:

    export.cpp
    9.2K
    ·
    百度網盤
    export.h
    418
    ·
    百度網盤

    3.4 修改CMake檔CMakeList.txt

    編寫CMakeList.txt需要理解CMake的語法,學習CMake語法推薦透過例子學習CMake ,這是中譯本,英語好的可直接學原專案例子。這裏最簡單的辦法是參考已有外掛程式的寫法,比如opcua、mqtt等。修改本工程的cmake檔如下:

    cmake_minimum_required(VERSION 3.20)#最低CMake版本 project(loadBinaryQuotes)# 工程名 if (WIN32 OR MINGW) set (platform_macro "-DWINDOWS") set (plugin_file "${CMAKE_CURRENT_LIST_DIR}/PluginLoadBinQuotes_win.txt") elseif (UNIX) set (platform_macro "-DLINUX") set (plugin_file "${CMAKE_CURRENT_LIST_DIR}/PluginLoadBinQuotes.txt") #為了相容舊的編譯器,libDolphinDB.so編譯時使用了-D_GLIBCXX_USE_CXX11_ABI=0的選項,因此使用者在編譯外掛程式的時候也應該加入該選項。若server是ABI=1的最新版,可不加。 add_compile_options("-D_GLIBCXX_USE_CXX11_ABI=0") endif () message("platform: ${platform_macro}") #添加編譯選項:-std=c++11 -fPIC -DWINDOWS(linux系統為-DLINUX) add_compile_options("-std=c++11" "-fPIC" ${platform_macro} "-Wall") #包含目錄 include_directories("../include") include_directories("./src") #包含庫目錄,libDolphinDB.dll所在目錄,即安裝DolphinDB的目錄,請根據實際安裝位置修改 link_directories(C:/DolphinDB/DolphinDB_Win64_V1.30.14/server) #庫的原始檔export.cpp生成動態庫PluginLoadBinQuotes add_library(PluginLoadBinQuotes SHARED ./src/export.cpp) #連結庫 target_link_libraries(PluginLoadBinQuotes DolphinDB ) #拷貝PluginLoadBinQuotes_win.txt(if windows)/PluginLoadBinQuotes.txt(if Linux)到build目錄(這裏為cmake-build-debug子目錄) add_custom_command( TARGET PluginLoadBinQuotes POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${plugin_file} ${CMAKE_BINARY_DIR}/PluginLoadBinQuotes.txt COMMENT "copy PluginLoadBinQuotes.txt")

    修改後,建議重新生成Makefile:點選下圖中1位置的CMake,然後點選2位置的圖示,在彈出選單項中選擇Reset Cache and Reload Project。

    然後就可選擇主選單Build->Rebuild project了,若程式碼沒問題,就能在cmake-build-debug目錄下生成libPluginLoadBinQuotes.dll了。

    4 偵錯程式碼

    4.1 偵錯環境準備

  • 先確認DolphinDB節點已執行
  • 用GUI連線節點,並用下列指令碼載入外掛程式:
  • loadPlugin("C:/DolphinDB/plugin/DolphinDBPlugin/loadBinaryQuotes/cmake-build-debug/PluginLoadBinQuotes.txt")

    外掛程式格式檔路徑根據實際情況修改。

    4.2 用CLion單步偵錯

    步驟1.Attach行程:先點選CLion主選單Run->Attach to process,在彈出的對話方塊中選擇或輸入dolphindb,如下圖所示:

    attach成功後,顯示界面如下:

    此時我們就可以debug了。

    步驟2.設定斷點:如下圖,滑鼠點選紅色圓弧處即在第12行設定了一個斷點。

    步驟3:在GUI中執行下列指令碼:

    t=loadBinaryQuotes::loadBin("C:/DolphinDB/plugin/DolphinDBPlugin/loadBinaryQuotes/600519.SH.dat")

    步驟4:這時再回到CLion界面,可看到程式已執行到如下圖紅圈所示斷點處:

    這時可點選上圖紅色方框處的偵錯按鈕進行step over、step into、Run to cursor等操作。在其底下檢視中也可檢視函數堆疊以及變量的值。

    偵錯成功,就可以在GUI中執行t[key]比如t[`snapShot]看到匯入到記憶體表中的數據了。

    5. 說明

    本文講解了win10上的偵錯環境搭建和程式碼偵錯,若你需要在linux上開發,建議在linux上安裝GNOME 或 KDE desktop,CLion支持在GNOME 或 KDE 上執行,偵錯也如同在windows上一樣友好。

    本文未詳細講解外掛程式程式碼如何編寫,有興趣者請參閱DolphinDB外掛程式開發教程 和DolphinDB外掛程式開發深度解析 。

    附錄

    完整工程程式碼:

    連結: https:// pan.baidu.com/s/16B7dva PrHQiAbuMbByF3Vw 提取碼: xvg7