本文以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 - 博客园 。
![](https://img.jasve.com/2024-4/8ae334f32e6a597f847b7b5a5620116e.webp)
1.2 安装CMAKE
下载链接: https:// cmake.org/download/
选择一个后缀为.msi的安装包下载,如下图划线所示:
![](https://img.jasve.com/2024-4/3d2f5327af2ef825e6c00d70546bace6.webp)
下载后双击安装,安装时记得勾选「Add CMake to the system PATH for all users」,这样就不用自己再配置环境变量了。
安装后按win+r运行cmd或者powershell输入cmake -v,出现如下图所示版本信息即表明安装成功:
![](https://img.jasve.com/2024-4/f08e60a83296d4656fd318931f1df620.webp)
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免费使用。
![](https://img.jasve.com/2024-4/6ea98bab1b0ab0393fc626fb709f2034.webp)
1.4 安装Git
下载链接:Git - Downloading Package
下载后双击一路默认安装即可,在cmd中运行git --version,显示如下图所示版本信息即表明安装成功。
![](https://img.jasve.com/2024-4/7e5a2cbec5820ca482ed601fe23898a1.webp)
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 即可下载。
![](https://img.jasve.com/2024-4/d130926c82cb27dedf134c2bbcc18d30.webp)
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时表示逐笔委托数据。具体格式参见
样本数据文件参见
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
其中:
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目录下。
![](https://img.jasve.com/2024-4/c2e6174584aeb837acedec6043005e47.webp)
步骤2. 打开CLion,点击New project,然后选择在左侧栏选择C++ Library,在右栏输入如下:
![](https://img.jasve.com/2024-4/61212562b9665cbfdcb8f37111d1ed62.webp)
在上图中输入完成后,点击右下角的Create,这时会弹出一个对话框说目录下非空,选择Create from Existing Sources即可。
![](https://img.jasve.com/2024-4/d18873376022b3238ba3c9ae965f5d95.webp)
这时CLion会生成工程如下图:
![](https://img.jasve.com/2024-4/67ff43222323027093c4975681c39b83.webp)
它自动生成了library.h/.cpp和CMakeLists.txt。如果我们点击菜单Build/Build Project,是能编译成功的。但这里我们不要library.h/.cpp,所以选中它们,点鼠标右键,delete它们。然后在src目录下添加2文件export.h和export.cpp。
![](https://img.jasve.com/2024-4/b96d9828cdc689e90508784f71ea318c.webp)
export.h主要用于导出动态库的函数,主要内容如下:
extern "C" ConstantSP getTables(Heap *heap, vector<ConstantSP> &args);
export.cpp主要用于实现插件函数getTables。两个文件具体参见:
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。
![](https://img.jasve.com/2024-4/94df53bbc50a20aa342c7e0276c61cc0.webp)
然后就可选择主菜单Build->Rebuild project了,若代码没问题,就能在cmake-build-debug目录下生成libPluginLoadBinQuotes.dll了。
4 调试代码
4.1 调试环境准备
loadPlugin("C:/DolphinDB/plugin/DolphinDBPlugin/loadBinaryQuotes/cmake-build-debug/PluginLoadBinQuotes.txt")
插件格式文件路径根据实际情况修改。
4.2 用CLion单步调试
步骤1.Attach进程:先点击CLion主菜单Run->Attach to process,在弹出的对话框中选择或输入dolphindb,如下图所示:
![](https://img.jasve.com/2024-4/0c5b8e1d768540b9bd1c8306442e9187.webp)
attach成功后,显示界面如下:
![](https://img.jasve.com/2024-4/c971506f438935c8513365b64bf104b9.webp)
此时我们就可以debug了。
步骤2.设置断点:如下图,鼠标点击红色圆弧处即在第12行设置了一个断点。
![](https://img.jasve.com/2024-4/7b3c9541fdb53168a7a073ba1b2df240.webp)
步骤3:在GUI中执行下列脚本:
t=loadBinaryQuotes::loadBin("C:/DolphinDB/plugin/DolphinDBPlugin/loadBinaryQuotes/600519.SH.dat")
步骤4:这时再回到CLion界面,可看到程序已执行到如下图红圈所示断点处:
![](https://img.jasve.com/2024-4/f8b92356a64363302762456761747029.webp)
这时可点击上图红色方框处的调试按钮进行step over、step into、Run to cursor等操作。在其底下视图中也可查看函数堆栈以及变量的值。
调试成功,就可以在GUI中执行t[key]比如t[`snapShot]看到导入到内存表中的数据了。
![](https://img.jasve.com/2024-4/544bca247c2c5852f0b015eafb63c137.webp)
5. 说明
本文讲解了win10上的调试环境搭建和代码调试,若你需要在linux上开发,建议在linux上安装GNOME 或 KDE desktop,CLion支持在GNOME 或 KDE 上运行,调试也如同在windows上一样友好。
本文未详细讲解插件代码如何编写,有兴趣者请参阅DolphinDB插件开发教程 和DolphinDB插件开发深度解析 。
附录
完整工程代码:
链接: https:// pan.baidu.com/s/16B7dva PrHQiAbuMbByF3Vw 提取码: xvg7