..
移植到Ubuntu18.04的坑 [update]
目前还有个工作就是把代码逐渐的往18.04上移植,先从一些测试分支开始。 下面就有遇到的一些问题记录,不定时的更新一下,直到彻底结束。
说明
默认使用 feature/evm 分支进行的编译移植。
问题列表
- 问题1
【描述】在使用 scons 1 编译系统的时候,提示没有找到ethash/keccak.hpp
头文件。
【解决】ethash 是系统嵌入的以太坊库,在老机器上是 scons 的配置是没有问题的,现在考虑18上的 scons 配置需要修改。 首先ethash的位置如下
-src
-|-ethash
-|-a
-|-b
查看 SConstruct 文件。
base.Append(CPPPATH=[
'src',
os.path.join('src', 'beast'),
os.path.join(build_dir, 'proto'),
os.path.join('src','soci','src'),
])
不去修改原有对 ethash 的设置,毕竟在低版本可行。 直接在该处代码中加上头文件的路径。
os.path.join('src','ethash', 'include'),
再去编译, 通过。
- 问题2
【描述】编译 lua 的时候,提示 lua.c:67:10: fatal error: readline/readline.h: No such file or directory。
【解决】应该是少库。2
直接安装即可sudo apt-get install libreadline6-dev
- 问题3
【描述】scons 编译, 提示 App.cpp:26:20: error: ‘in_place’ is not a member of ‘boost’。
【解决】之前使用的 boost 是 1_57_0 版本的, 升级到 1_65_0 后, 该接口的位置发生了改动。 需要添加上头文件#include <boost/utility/in_place_factory.hpp>
- 问题4
【描述】编译提示: Factory.cpp:99:18: error: ‘cerr’ is not a member of ‘std’。
【解决】添加头文件#include <iostream>
- 问题5
【描述】在解析时间的时候,提示解析 Wed May 27 19:15:54 2020 UTC ,错误。 解析函数如下def parse_time(t): return time.strptime(t, '%a %b %d %H:%M:%S %Z %Y')
默认的时间为
BUILD_TIME = 'Mon Apr 7 20:33:19 UTC 2014'
【解决】上述解析错误的时间,是 openssl version -a 显示的编译时间。
在老版本中openssl显示的信息为OpenSSL 1.0.1f 6 Jan 2014 built on: Tue Dec 4 20:09:18 UTC 2018 platform: debian-amd64
在18上openssl显示的信息是
OpenSSL 1.1.1 11 Sep 2018 built on: Wed May 27 19:15:54 2020 UTC platform: debian-amd64
build on 字段发生了变化。 同时修改 parse_time 和 BUILD_TIME 即可。 修改为:
def parse_time(t): return time.strptime(t, '%a %b %d %H:%M:%S %Y %Z')
BUILD_TIME = 'Mon Apr 7 20:33:19 2014 UTC'
- 问题6
【描述】编译提示: basic_seconds_clock.h:66:32: error: ‘bind’ is not a member of ‘std’ 。
【解决】添加头文件#include <functional>
- 问题7
【描述】在连接阶段,提示: /usr/bin/ld: cannot find -lethash 【解决】看来,没找到库。 先确认下 ethash 是不是以静态库的方式嵌入到系统里面的,还是直接源码嵌入?
再看 scons 的编译设置,append_sources( result, 'src/ethash/lib/ethash/ethash.cpp',
可以确认,是源码形式直接进行嵌入,因此不需要 -l 来引用它。 去掉 scons 中的 LIBPATH 就可以了。
#env.Append(LIBS=['ethash'])