编译kungfu1.0时产生的问题和解决方案汇总(1)

编译kungfu1.0时产生的问题和解决方案汇总(1),第1张

编译kungfu-1.0时产生的问题和解决方案汇总
    • 1. 在执行make命令时,python库找不到。
    • 2. 在使用docker环境下运行的kungfu1.0的时候,ctp连接不上的问题。

为什么要用1.0呢?
这是最后一个使用python2.7开发的版本。
是以 Docker/rpm 方式运行的最后稳定版本。
俺的目的是二次开发。

1. 在执行make命令时,python库找不到。
lighthouse@VM-12-6-ubuntu:/home/liuchang/kungfu-1.0.0/build$ sudo make 
[  3%] Built target kflog
[  5%] Linking CXX shared library libjournal.so
/usr/bin/ld: cannot find -lpython
collect2: error: ld returned 1 exit status
yijinjing/journal/CMakeFiles/journal.dir/build.make:367: recipe for target 'yijinjing/journal/libjournal.so.1.1' failed
make[2]: *** [yijinjing/journal/libjournal.so.1.1] Error 1
CMakeFiles/Makefile2:185: recipe for target 'yijinjing/journal/CMakeFiles/journal.dir/all' failed
make[1]: *** [yijinjing/journal/CMakeFiles/journal.dir/all] Error 2
Makefile:151: recipe for target 'all' failed
make: *** [all] Error 2

使用make VERBOSE=1命令,可以看到更加详细的错误日志的输出。

[ 27%] Linking CXX shared library libjournal.so
cd /home/liuchang/kungfu-1.0.0/build/yijinjing/journal && /usr/bin/cmake -E cmake_link_script CMakeFiles/journal.dir/link.txt --verbose=1
/usr/local/gcc-11.1.0/bin/g++-11.1 -fPIC  -std=c++11 -O3 -Wall  -shared -Wl,-soname,libjournal.so.1.1 -o libjournal.so.1.1 CMakeFiles/journal.dir/Journal.cpp.o CMakeFiles/journal.dir/JournalHandler.cpp.o CMakeFiles/journal.dir/JournalReader.cpp.o CMakeFiles/journal.dir/JournalWriter.cpp.o CMakeFiles/journal.dir/Page.cpp.o CMakeFiles/journal.dir/PageUtil.cpp.o CMakeFiles/journal.dir/PythonExtend.cpp.o CMakeFiles/journal.dir/PageProvider.cpp.o CMakeFiles/journal.dir/StrategyUtil.cpp.o CMakeFiles/journal.dir/JournalFinder.cpp.o CMakeFiles/journal.dir/__/utils/Timer.cpp.o -lpython /opt/kungfu/toolchain/boost-1.62.0/lib/libboost_locale.so /opt/kungfu/toolchain/boost-1.62.0/lib/libboost_date_time.so /opt/kungfu/toolchain/boost-1.62.0/lib/libboost_filesystem.so /opt/kungfu/toolchain/boost-1.62.0/lib/libboost_system.so /opt/kungfu/toolchain/boost-1.62.0/lib/libboost_thread.so /opt/kungfu/toolchain/boost-1.62.0/lib/libboost_serialization.so /opt/kungfu/toolchain/boost-1.62.0/lib/libboost_math_tr1.so /opt/kungfu/toolchain/boost-1.62.0/lib/libboost_python27.so /opt/kungfu/toolchain/boost-1.62.0/lib/libboost_chrono.so /opt/kungfu/toolchain/boost-1.62.0/lib/libboost_regex.so /opt/kungfu/toolchain/boost-1.62.0/lib/libboost_program_options.so /opt/kungfu/toolchain/boost-1.62.0/lib/libboost_atomic.so -lpthread
/usr/bin/ld: cannot find -lpython
collect2: error: ld returned 1 exit status
yijinjing/journal/CMakeFiles/journal.dir/build.make:367: recipe for target 'yijinjing/journal/libjournal.so.1.1' failed
make[2]: *** [yijinjing/journal/libjournal.so.1.1] Error 1
make[2]: Leaving directory '/home/liuchang/kungfu-1.0.0/build'
CMakeFiles/Makefile2:185: recipe for target 'yijinjing/journal/CMakeFiles/journal.dir/all' failed
make[1]: *** [yijinjing/journal/CMakeFiles/journal.dir/all] Error 2
make[1]: Leaving directory '/home/liuchang/kungfu-1.0.0/build'
Makefile:151: recipe for target 'all' failed
make: *** [all] Error 2

当前环境:
gcc11 g++11
cmake version 3.10.2
boost1.69
rfoo 1.3.1
pid 2.1.1
log4cplus2 2.0.0_RC1
supervisor 3.1.0

对于这个问题,网上看了很多,仍然没有办法解决。

简单分析一下这个报错。 cannot find -lpython,这个-lpython其实是library python的意思,也就是python相关的so文件没有找到。这样看来,其实找一下cmake库里的动态链接的路径,看看有没有那个路径指向错误的地方。或者对照一下现有的可以运行的镜像里的so文件,然后拷贝一下。

按照这个思路,编译过程的问题是肯定可以被解决的。

我配置的环境目前配置在腾讯云的应用服务器上面。
我的腾讯云的云服务器里有一个之前可以跑通的镜像。
上级还给了一个安装环境的脚本sh文件。
在kungfu1.0的源码目录下面还有几个很好的文档。

我觉得可以对照这些很好的资源。把环境一点一点的配起来。
后面的文章针对这个大问题进行逐个的击破。
首先存在的一个问题就是boost_python的测试cpp通不过的问题。以及boost1.62的安装问题。

2. 在使用docker环境下运行的kungfu1.0的时候,ctp连接不上的问题。

咱们来看一下我的运行过程。

在已经安装好了kungfu的情况下,可以通过下面的命令快速的进行启动。
(在镜像名字为kungfu的情况下)

$ sudo systemctl start docker
$ sudo docker start kungfu
$ sudo docker exec -it kungfu bash
$ sudo systemctl start kungfu
$ sudo systemctl status kungfu

然后看一下配置的信息。这里我先配置了md_ctp的账户信息:

"md":
  {
    "ctp":
    {
      "FrontUri": "tcp://180.168.146.187:10211",
      "UserId": "XXXXXX",
      "BrokerId": "9999",
      "Password": "XXXX"
    },

在这个网站CTP开放平台运行环境监控上,我可以看到,我当前使用的这个ctp的行情URL是通的。

官方文档的说明:

账户的配置信息中 FrontUri 是前置地址,如果使用的是 simnow 仿真账户可以在 simnow 官网查询, UserId 和 InvestorId 均为投资者账户,BrokerId 为券商代码,simnow 账户 BrokerId 一般为 9999。simnow投资者账户需要使用客户端登录并修改密码以后方可使用。

密码我也按照上述说明在客户端做了修改。

然后,我满怀期待开始运行…

[root@VM-12-6-ubuntu kungfu]# kungfuctl
md_ctp                           FATAL     Exited too quickly (process log may have details)
md_xtp                           STOPPED   Not started
td_ctp                           STOPPED   Not started
td_xtp                           STOPPED   Not started
yijinjing                        RUNNING   pid 4804, uptime 3:25:32
kungfu> start md_ctp
md_ctp: ERROR (abnormal termination)

然后咱们去查一下日志:

22-04-22 13:10:18.712 INFO  MdEngine.CTP %% - IEngine::init Password->"XXX"
22-04-22 13:10:18.713 INFO  MdEngine.CTP %% - IEngine::init UserId->"XXXXXX"
22-04-22 13:10:18.720 INFO  MdEngine.CTP %% - [OnFrontConnected]
22-04-22 13:10:18.731 INFO  MdEngine.CTP %% - [OnFrontDisconnected] reason=4097
22-04-22 13:10:18.738 INFO  MdEngine.CTP %% - [OnFrontConnected]

reason=4097 代表什么呢?
我去搜索一下。

1)核对版本

目前CTP要求API版本和后台版本一致才能有正确的onfrontconnected回调。

版本不对会不停地回调OnFrontDisconnected,或者输出Decrypt handshake data
failed,或者没有任何反应。

所以先检查API版本是否正确,可以调用函数GetApiVersion输出当前API版本。

目前期货公司正式生产和simnow上均是v6.3.15_20190220版本,期货公司评测使用v6.3.13或者v6.3.16版本(小版本号不影响评测)。

来源:
https://zhuanlan.zhihu.com/p/92289091
那么功夫1.0的CTP的版本是多少呢?
我查看了kungfu源码目录下的config.in文件,里面写的是6.3.6版本(如下面所示),发现确实和simnow后台用的6.3.15存在版本的不一致。

在这种情况下,我觉得想要通过连通的话。就应该对源码中使用的CTP接口文件进行更新。

CTP_VERSION=v6.3.6_20160606
XTP_VERSION=XTP_API_20180227_1.1.16.20

那问题该如何解决呢?
上级命令:运行最新版本的CTP,然后尝试把这个它里面的CTP文件拷贝出来进行替换。

我发现了源码里面的ctp和xtp接口文件存在这个路径下面。
/kungfu-1.0.0/longfist/api


如何更换ctp接口文件呢?
其实这个没有任何的难度,网上应该很容易就找到了。然后需要更改so文件的名字,并且保持目录结构和原理来的是一致的。

经过测试验证,在把接口文件更换了之后,ctp可以成功启动起来了!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/730721.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存