编译kungfu-1.0时产生的问题和解决方案汇总
为什么要用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]
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可以成功启动起来了!
|