..

移植到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'])