简介:这套WonderTrader依赖库是作者在Ubuntu 22.04、gcc 11.4.0环境下编译生成的头文件集合,定位为WonderTrader框架的第三方C++依赖层,适合需要在Linux平台自行编译该量化交易系统的开发者。压缩包共收录2000个文件,其中1856个为hpp头文件,144个为h头文件,涉及schema、document、format、reader、pointer、chrono、pattern_formatter等常用基础模块,整体大小约14.5MB,便于直接纳入本地工程。资源同时附带CMakeLists.txt修改说明,通过export MyDependsGcc=/deps/wtcpp设置环境变量,即可在编译时动态指定依赖路径,免去手动修改默认/home/mydeps目录的步骤,降低环境配置难度。资源当前已有236人学习下载,适用于Ubuntu 22.04环境下的WonderTrader搭建与二次开发,尤其适合希望减少依赖编译成本、快速进入业务代码编写的中高级开发者。文件按头文件目录组织,方便按模块引用和核对版本,整体是一个能直接衔接编译流程的依赖包。 做量化交易的朋友,对WonderTrader这个名字应该不陌生。这套开源的C++量化交易框架,以高性能著称,行情处理、回测、实盘都能一套代码打通,在圈子里口碑一直不错。但有个很现实的门槛:它并不是下个release解压就能跑,源码构建阶段需要一批依赖库加持。我见过很多人在这一步折戟,踩过各种编译报错、缺少头文件、运行时缺dll的坑。这篇文章我就把自己折腾WonderTrader依赖库的经验整理出来,重点讲清楚几件事:依赖库到底解决了什么问题、哪些必须装、从哪里下载最可靠、以及编译和运行中最容易踩的坑怎么绕开。不管你是刚接触wt的初学者,还是准备把它集成进自己交易系统的老手,这篇都能帮你在依赖库环节少走弯路。
1. 为什么WonderTrader要带这么多依赖库
1.1 框架定位决定了依赖库的量级
先理解一下WonderTrader的定位:它不是一个单文件小工具,而是一整套量化交易框架,包含行情接入、交易通道、回测引擎、风控模块、数据落地、监控运维等多个部分。C++本身并不自带这些能力,而作者又不想把每一个基础设施都从零造一遍,所以合理的选择就是站在成熟第三方库的肩膀上。这有点像盖房子,主体结构当然是自己设计,但水电管线、门窗五金这类标准件,直接用成熟品牌肯定比自己现场敲更可靠,也更省时间。
用依赖库带来的实际收益是:功能稳定性高、迭代速度快、社区生态通用。问题也很直接——依赖关系复杂之后,编译和部署的门槛就上来了。尤其是在Windows平台上,C++的编译环境本来就比Linux复杂,动态库的搜索路径、运行库模式、编译器版本这些细节,任何一个不匹配,都能让编译或运行阶段直接报错,而且报错信息往往还不友好。
1.2 这些依赖库各自在扛什么活儿
我把WonderTrader构建中比较常见的几类依赖整理了一下,大致如下:
| 依赖库 | 作用领域 | 为什么框架需要它 |
|---|---|---|
| Boost | 系统工具集 | 提供跨平台的文件系统、线程、日期时间、智能指针等基础能力 |
| oneTBB | 并行计算 | 行情分发、多账户并发等场景下做任务调度和并行算法加速 |
| glog | 日志处理 | 框架运行日志的分级输出,遇到问题没有日志等于盲人摸象 |
| protobuf | 数据序列化 | 行情、交易回报等消息体的高效编码解码,也用于部分存储格式 |
| zlib | 数据压缩 | 历史行情数据、逐笔数据的压缩解压,节省磁盘和带宽 |
| jsoncpp | 配置解析 | 读取策略参数、模块配置、协议字段等JSON格式内容 |
| MySQL客户端 | 数据库对接 | 把行情、交易数据写入数据库,或从数据库读取历史数据 |
| hiredis | 数据库对接 | 接入Redis时需要的C语言客户端库 |
每个库都不是凑数。比如TBB,在单线程处理行情的情况下你可能感觉不到它存在,但当某个策略引擎要同时处理几十个合约的行情,又要实时计算组合风险的时候,TBB的任务调度能力就直接决定系统会不会卡顿。再比如protobuf,它保证了行情和回测数据在磁盘上的存储格式紧凑且版本兼容,否则每次升级框架,旧数据可能就没法读了。
2. 依赖库版本选择与匹配的关键点
2.1 核心依赖的大致版本范围
依赖库不是随便装一个最新版就行。WonderTrader社区一般建议的版本区间是这样的:
- Boost:建议1.76以上,推荐使用较新的1.8x系列,文件系统和上下文这两个模块的整体稳定性更好
- oneTBB:建议2021系列,注意老TBB已经被Intel改名oneTBB,直接搜TBB容易买到过时版本
- protobuf:建议3.19以上的3.x版本,4.x带来的兼容性问题比较多,框架接口尚未完全跟进
- glog:建议0.6.x版本,这是目前比较稳定且和框架代码配合良好的版本
- zlib、jsoncpp:这两个相对宽松,跟随当前稳定版即可
请注意,这个范围是我个人在历史版本上的经验总结。WonderTrader迭代很快,上游依赖也可能调整,最权威的信息仍然是克隆下来的源码里的README、docs目录下的编译指南,以及根目录CMakeLists.txt里声明的依赖版本号。拿到源码先花十分钟把CMakeLists看一遍,比你盲目装最新库高效得多。
2.2 所谓“可选依赖”,经常是实际编译时的硬门槛
查看WonderTrader的编译配置时,你会看到MySQL、Redis这些数据库支持是可选开关。但很多人的做法是直接全部编译,结果MySQL头文件、hiredis头文件找不到,编译直接中断。所以对大多数使用者来说,如果不打算用数据库持久化,最省事的策略是在CMake配置阶段显式关掉不需要的组件,而不是试图把依赖凑齐。
反过来说,如果你确实需要数据库功能,那MySQL客户端库就得按对应架构去准备。MySQL官方提供的C Connector版本要和你编译器的位数一致,32位和64位不能混用,否则链接阶段同样会报错。
2.3 比版本更隐蔽的坑:运行库模式
这是C++项目最经典的坑之一。在Windows上用MSVC编译时,运行库有/MT和/MD两种模式。如果WonderTrader官方提供的依赖包是用/MD编译的,而你自己手动编译的某个依赖库用了/MT,两者一链接,编译器就会抛LNK2038运行库不匹配,看起来莫名其妙,实际就是两边用的CRT不一样。
所以结论是:优先使用官方预编译的依赖包,或者自己准备依赖时,所有库的编译选项必须完全一致。这个原则写下来只有一行,但执行时容易疏忽,尤其是混合了源码编译和预编译包的时候。
3. 依赖库下载入口与编译全流程实操
3.1 最省事的路径:找官方预编译依赖包
我自己第一次编译时,定下的原则是“能用现成的就不自己编译”。WonderTrader的官方仓库会维护预编译依赖,按下面的步骤操作,一般能把问题控制在最小范围:
- 打开WonderTrader的GitHub仓库,把代码clone到本地,建议放到纯英文路径下,避免中文目录引发编译器编码问题
- 查看仓库的README和docs目录,找到“编译/构建/依赖”相关说明,官方会写明依赖包获取方式,有的在Releases页面里独立提供,有的在文档中标注下载入口
- 按说明下载依赖包,解压到某个固定目录,例如
D:\WT\deps,确保这个目录内能直接看到include和lib两个子目录 - 在系统环境变量里新增一个依赖路径变量,例如
WT_DEPS_PATH,指向依赖目录 - 在源码目录执行CMake配置和编译
这套流程的核心是:用官方打好的依赖包,版本和编译模式都经过作者团队验证,能避免一大批低级问题。如果你在搜索过程中看到“依赖库官网下载入口”这类关键词,注意分辨,真正需要认准的是WonderTrader官方仓库的Releases页面,不在别的站点。
这里想额外提醒一句:网上搜索“WT依赖库”时,很容易混进来一些完全无关的内容,比如UE4运行库、其他软件的依赖包,这些都是搜索推荐层面的干扰项。看文件名和仓库来源,只要不是wondertrader仓库或官方文档里指的包,就不要装。
3.2 用vcpkg走源码编译路线
如果你需要定制某个依赖库的特殊版本,或者官方预编译包暂时不可用,那vcpkg是一个不错的备选方案。vcpkg是微软开源的C++包管理器,可以指定平台和版本安装第三方库。
一个大致的安装流程是:
git clone https://github.com/microsoft/vcpkg.git cd vcpkg bootstrap-vcpkg.bat vcpkg install boost tbb protobuf glog zlib jsoncpp --triplet x64-windows装完之后,在CMake配置时通过CMAKE_TOOLCHAIN_FILE指向vcpkg的工具链文件。需要注意,vcpkg默认安装的是它仓库里的最新版本,不一定和WonderTrader要求的版本完全吻合,所以推荐在项目里使用vcpkg的manifest模式,写死每个库的版本号,保证可复现。我在自己的项目里就是这么干的,换机器、换同事的电脑都能一键还原环境。
vcpkg这条路适合有一定C++经验的人,因为它会自己编译,耗时和磁盘占用都不小,全量构建一次boost可能要等挺久。如果你想先把WonderTrader跑起来,我个人不推荐这条路线,先用官方依赖包,后面确实有定制需求再切换。
3.3 Windows和Linux下的CMake配置实战
依赖库就绪后,用CMake搭建构建目录。Windows下我习惯用Visual Studio生成器,执行下面这段:
cmake -B build -A x64 -DCMAKE_BUILD_TYPE=Release -DWT_DEPS_PATH=D:\WT\deps cmake --build build --config Release -j8Linux下则是系统包管理器负责依赖,再交给CMake:
sudo apt install build-essential cmake git libboost-all-dev libprotobuf-dev protobuf-compiler libgoogle-glog-dev libtbb-dev zlib1g-dev libjsoncpp-dev cmake -B build -DCMAKE_BUILD_TYPE=Release cmake --build build -j$(nproc)不管哪个平台,请养成一个习惯:单独建一个build目录,不要直接在源码目录里生成构建产物。好处有两个,一是源码目录干净,二是想换一套依赖或者切换编译模式时,直接删掉build重来,不需要重新clone代码。
3.4 用wtpy的人其实也绕不开依赖库
很多刚接触WonderTrader的朋友并不是直接编译C++,而是通过Python包wtpy在写策略。wtpy这个wheel包设计得比较贴心,安装时会自动把底层C++核心的dll、必要的第三方依赖dll一起带进去,使用者不需要手动去折腾boost、protobuf这些。
但要注意,wtpy的预编译包也有平台区分。Windows下的wheel包不会在Linux上工作,macOS的支持情况也要看官方发布计划。如果你使用的是Linux服务器做实盘或回测,很可能还是需要自己编译一套C++核心库,这一步就完全避不开依赖库准备。所以我的建议是:哪怕最终只写Python策略,也抽时间把C++底层编译一次,对整个框架的运行机制会有更直观的理解。
4. 依赖库常见问题与排查记录
4.1 运行时突然报“找不到xxx.dll”
这是新手最容易遇到,也最好解决的问题。程序启动时弹窗提示缺少某个dll,比如boost动态库、protobuf的dll等。原因很简单:系统在PATH路径里没找到对应的动态库。
排查思路:
- 去依赖目录确认这个dll是否存在
- 如果存在,把依赖目录下的bin或对应的动态库目录添加到系统环境变量PATH
- 如果不想改系统变量,直接把需要的dll复制到你的exe或python进程所在目录,Windows加载dll的优先级中,应用当前目录本来就排得很靠前
我个人倾向于把动态库目录写进PATH,而不是每次复制dll,因为复制方案在版本升级时会留下很多废文件,时间长了容易造成新老版本混乱。
4.2 链接期报LNK2038、LNK2005之类的运行库冲突
前面提过,这大多是因为不同依赖库的运行库模式不一致导致的C++链接问题。遇到这种报错,先确认所有依赖库的编译模式是否一致,重点是MD/MT是否统一,debug和release是否对应。如果混合了static和动态库,优先统一成官方依赖包使用的模式。
另一个容易让人迷惑的点在于:debug库和release库混用也会出现类似报错。比如你项目用Release模式编译,却链接了Debug版本的某个第三方库,运行起来还会伴随内存错误、崩溃等诡异现象。这种问题定位起来很费时间,我的习惯是在下载依赖包时专门看目录名,确认是release还是debug,并在CMake配置里严格对应。
4.3 protobuf版本冲突导致的诡异报错
如果你机器上还有其他软件或C++项目在用protobuf,可能会遇到符号冲突或者运行时版本检查失败。protobuf库对版本比较敏感,不同大版本之间的兼容性本来就不完美。
处理办法有两个:一是让WonderTrader依赖目录里的protobuf在链接顺序上优先,保证加载的是同一套;二是如果只是运行阶段冲突,可以用动态库依赖检测工具看进程实际加载了哪个protobuf dll,再决定是替换dll还是调整PATH顺序。不要把多个protobuf版本放同一个目录,容易互相踩踏。
4.4 编译太慢的提速经验
处理依赖库和编译耗时是两件事,但上游依赖越多,全量编译时就越长。有几个实用招数:
- 尽量增量编译,每次只改框架代码的一小块,不要动不动动依赖库
- 使用多进程编译参数,Windows用/MP,Linux用-j,别默认单核硬扛
- CMake的ccache可以缓存编译结果,多次构建时提速非常明显
- 除非特殊需要,显式关闭用不到的数据库、监控组件,减少不必要的编译目标
4.5 下载依赖包太慢或者总是中断怎么办
第三方依赖体积不小,在网络环境不太理想时,下载半天下载失败确实折磨人。我的经验是:找个网络稳定的时段,手动下载依赖包,完成后校验一下压缩文件是否完整,然后保存在本地固定目录,后续反复使用。不要每次构建都重新下载,既慢又容易出问题。
处理完所有报错,看到一个干净的编译成功提示,那感觉还是很爽的。依赖库的问题看着琐碎,其实背后就三个核心变量:版本、编译模式、路径配置。把这三件事理清楚,WonderTrader的构建和运行就会顺畅很多。最后再分享一个我自己的习惯:所有第三方依赖固定放在一个专属目录,不往全局装,换机器时整个目录打包带走,到新环境设置一次依赖路径变量就能还原。依赖库这东西,第一次折腾确实痛苦,但只要一次把路走通,后面所有项目都会轻松不少。希望这篇记录能帮你少踩几个坑。
本文还有配套的精品资源,点击获取