Windows10 和 Ubuntu 编译Bitcoin

Posted 落霞与孤鹜亓飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows10 和 Ubuntu 编译Bitcoin相关的知识,希望对你有一定的参考价值。

1. Windows 10 下使用Visual Studio 2019编译Bitcoin

目前Bitcon 官网上推荐用VS2017或者VS2019进行编译,本文用VS2019进行编译,这里是官方编译文档

  1. 从github官网下载bitcoin源代码。

    • git clone https://github.com/bitcoin/bitcoin.git
  2. 我编译的是比特币0.19版本,在进行编译前,先切换到0.19版本,你也可以选择自己编译其他版本。

    • cd bitcoin
    • git checkout 0.19
  3. 下载vcpkg,用于安装和管理bitcoin依赖的第三方包, vcpkg 可以下载到任何位置。

    • git clone https://docs.microsoft.com/en-us/cpp/vcpkg
  4. 将vcpkg加入系统环境变量的path中,即将vcpkg.exe所在父目录加入到系统变量的Path中,例如我的vcpkg直接在c盘,那么Path中添加"C:\\vcpkg"。

  5. 使用vcpkg下载Bitcoin需要的第三方包, 在vcpkg.exe所在的目录输入如下指令。 需要说明的是,这个指令和Bitcoin Github官网上的编译命令有所不同,区别是对于libevent[thread]的安装,我安装过程中系统报错:Error: thread is not a feature of package libevent,于是我索性改为vcpkg install libevent。

    • vcpkg install --triplet x64-windows-static berkeleydb boost-filesystem boost-multi-index boost-signals2 boost-test boost-thread libevent zeromq double-conversion
  6. 将vcpkg所有下载安装的包集成至Visual Studio中,集成指令如下。 通过上述配置,在VS项目中便可以直接#include三方库目录/头文件,库的引用和链接会自动完成,不用手工指定依赖的lib和头文件。

    • vcpkg integrate install
  7. 管理员身份打开powershell(windows terminal 也可以),进入bitcoin源文件目录下,输入如下指令。v142表示VS2019, 默认为v141 即VS2017。这里不得不吐槽一下,官方这个教程做的真是差,我仔细看了这个msvc-autogen.py脚本才知道还可以指定脚本,而且运行msvc-autogen.py的python语法是错的。

    • python build_msvc\\msvc-autogen.py -toolset=v142
  8. 在bitcoin源文件目录下,以管理员身份打开vs2019的x86_x64 Cross Tools Command Prompt for VS 2019命令行工具进行编译,命令如下。因为最终目的是要在VS2019中进行调试,所以是Debug模式,如果只想生成可运行文件,将Debug修改为Release即可。如果你的电脑是32位,那么可以把x64修改为x86。

    • msbuild /m build_msvc\\bitcoin.sln /p:Platform=x64 /p:Configuration=Debug /t:build
  9. 按照正常流程,应该不会出现问题,但是实际上,我在第8个步骤就遇到了很多个错误,不过这些错误都是一类,显示如下:

    • error MSB4019: 未找到导入的项目“C:\\Microsoft.Cpp.Default.props”。请确认 <Import>声明中的路径正确,且磁盘上存在 该文件.
  10. 通过Google搜索到解决方案,总共有3种,主要是设置VCTargetsPath的路径,这个路径下面有Microsoft.Cpp.Default.props文件,如果实在找不到这个文件的话,可以使用everything直接在全局搜索“Microsoft.Cpp.Default.props”这个文件,可以找到包含它的路径。

      1. 在以**管理员身份**打开x86_x64 Cross Tools Command Prompt for VS 2019,输入如下指令(在)。指令中具体V120还是V140根据本地安装的Visual Studio版本而定。但是如果是VS2019, 路径是"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\MSBuild\\Microsoft\\VC\\v160\\\\", 可以注意到路径最后仍然多了一个斜杠,因为不添加斜杠不能通过。下面的三条命令根据自己VS版本选择执行。
    
         - SET VCTargetsPath=C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\MSBuild\\Microsoft\\VC\\v160\\
    
      2. 在管理员身份打开powershell,输入如下指令(按照VS版本选择执行一条)。
    
         - \\[Environment\\]::SetEnvironmentVariable("VCTargetsPath", "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\MSBuild\\Microsoft\\VC\\v160\\", "Machine""
    
      3. 打开**注册表编辑器**(命令行输入 regedit即可),找到HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MSBuild\\ToolsVersions\\4.0路径,给4.0目录增加VCTargetsPath变量,其值修改Microsoft.Cpp.Default.props的文件目录。我的值修改如下:
    
         - C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\MSBuild\\Microsoft\\VC\\v160\\
    
      4. 其实这三种方法,路径都是同一个,就是方案有所不同,以我的经验来看,三个命令输入完成后相关参数不会立刻进行修改,可以重启电脑。上述方法的[参考连接.](https://stackoverflow.com/questions/16092169/why-does-msbuild-look-in-c-for-microsoft-cpp-default-props-instead-of-c-progr)
    
  11. 实际上,我把上述三个方法都给试了一次,然后继续执行第8个步骤的指令:

  • msbuild /m build_msvc\\bitcoin.sln /p:Platform=x64 /p:Configuration=Release /t:build

这时候如果显示一些Qt什么的编译失败,那是没有问题的,因为我们本身就没有安装qt相关的依赖文件,而且我只打算编译没有界面模式的Bitcoin文件,这时候基本编译成功了。

15.我比较倒霉,解决了一个问题,但是运行上述命令行的时候又遇到了第二个错误:

error MSB4186: 未找到方法“Microsoft.Build.Utilities.ToolLocationHelper.FindRootFolderWhereAllFilesExist”

经过查询发现,FindRootFolderWhereAllFilesExist这个方法是MSBuild 16.0版本中的方法,但是gacutil的cache文件中混入了15.1.0.0版本的功dll文件,编译时采用了15.1.0.0的版本,就会导致编译失败,将15.1.0版本的内容卸载即可。在X86_x64 Cross Tools Command Prompt 中使用gacutil命令输入如下:

gacutil /u “MSBuild, Version=15.1.0.0”

gacutil /u “Microsoft.Build.Conversion.Core, Version=15.1.0.0”

gacutil /u “Microsoft.Build, Version=15.1.0.0”

gacutil /u “Microsoft.Build.Engine, Version=15.1.0.0”

gacutil /u “Microsoft.Build.Tasks.Core, Version=15.1.0.0”

gacutil /u “Microsoft.Build.Utilities.Core, Version=15.1.0.0”

gacutil /u “Microsoft.Build.Framework, Version=15.1.0.0”

上述命令中,/u 表示卸载,gacutil的相关指令可以查看这里

这个方法的参考来源:

  • https://developercommunity.visualstudio.com/content/problem/338245/msb1025-error-for-any-projects-after-upgrade-to-vs.html
  • https://developercommunity.visualstudio.com/content/problem/311136/update-to-1580-projects-wont-load.html
  • https://github.com/dotnet/msbuild/issues/3733
  • https://xbuba.com/questions/47670576
  1. 然后继续运行第8个步骤的指令,基本上就通过了。这时候可以在VS2019中打开bitcon.sln文件,然后可以调试了。因为我没有安装qt需要的一些安装包,而且调试bitcoin也不需要界面,我们首先打开VS 2019,在解决方案浏览器(英文Solution Explorer)中,如下图所示。

  2. 选择bitcoind,鼠标右键单击,选择将bitcoind设置为启动项,然后打开bitcoind中的bitcoin.cpp文件,给main函数加断点,然后按F5即可进入调试。

  3. **PS:**我并不需要界面调试,因此qt这方面的依赖库我没有安装。

2. Ubuntu 下编译Bitcoin

Ubuntu下编译Bitcoin的官方参考文档

  1. 从github官网下载bitcoin源代码。

    • git clone https://github.com/bitcoin/bitcoin.git
  2. 安装必要的依赖包,下面命令将整个Bitcoin运行需要的全部依赖包进行了安装。

    sudo apt-get install build-essential libtool autotools-dev automake pkg-config bsdmainutils python3
    sudo apt-get install libevent-dev libboost-system-dev libboost-filesystem-dev libboost-test-dev libboost-thread-dev
    sudo apt-get install libminiupnpc-dev
    sudo apt-get install libzmq3-dev
    sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools
    sudo apt-get install libqrencode-dev
    
  3. 进入bitcoin文件,切换到0.19版本,然后运行autogen.sh文件:

    • git checkout 0.19

    • sudo sh ./autogen.sh

  4. 进行整个系统的配置。如果只是运行系统,不是真正使用bitcon的钱包系统,在configure中配置不使用钱包:

    • ./configure --disable-wallet
  5. 使用make指令进行编译, -j4表示4核并行编译,如果你的机器是2核,那就是-j2,另外也可以直接sudo make进行编译,只是慢一点而已。

    • sudo make -j4
  6. 在第5步骤中可能会出现下面错误:

    bin/bash: … /share/genbuild.sh:Permission denied

    解决办法是修改bitcon中share文件的权限:

    • cd /bitcoin/share

    • chmod 777 genbuild.sh

  7. 在第5步骤中也可能出现如下错误:

    “undefined reference to `OPENSSL_init_crypto‘”

    这个问题是openssl的版本问题导致的,我遇到这个问题的时候,将openssl从1.1.1g版本换为1.0.2a版本, openssl历史版本可以从这里下载,openssl的安装方法见这里.

    wget https://www.openssl.org/source/openssl-1.0.2a.tar.gz
    tar -zxvf openssl1.0.2a
    ./config --prefix=/usr/local --openssldir=/usr/local/ssl
    make && make install
    ./config shared --prefix=/usr/local --openssldir=/usr/local/ssl
    make clean
    make && make install
    

    prefix 是安装目录,openssldir是配置文件目录,另外建议安装两次,shard作用是生成动态链接库

  8. 编译成功后,使用make install指令进行安装,下面指令制定安装到/home/alice/bitcoin路径下,读者可以指定自己的安装位置。

    • sudo make install DESTDIR=/home/alice/bitcoin
  9. 安装成功后,可执行文件在/home/alice/bitcoin/usr/local/bin文件下,生成如下文件.

    • bench_bitcoin bitcoin-cli bitcoind bitcoin-qt bitcoin-tx test_bitcoin test_bitcoin-qt
  10. 其中bitcoind是全节点命令行程序,在命令行中输入./bitcoind 即可以默认的方式进行启动。不过我不建议你这么使用,在启动之前最好配置一个bitcoin.conf文件,这个文件里面可以配置很多内容,例如区块文件的存储位置、是否转发交易、交易池大小等等。配置文件的使用和配置方法具体信息参考这里

    • ./bitcoind 默认启动方案
    • ./bitcoind -conf=/home/alice/bitcoin/bitcoin.conf 指定配置文件的启动方式
  11. 命令行bitcoind程序如何退出?在bin文件下,通过bitcoin-cli结束运行。下述命令告知系统结束运行。如果强行结束会破坏系统中区块文件存储,因此建议按照这个命令退出程序。bitcoin-cli是一个命令行工具,在bitcoind程序运行的时候,可以通过该命令行工具获得系统运行的一些信息,例如连接的节点数、交易池大小等等。

    • ./bitcoin-cli stop
  12. 卸载bitcoin,需要先退出系统,然后使用make uninstall指令卸载。整个卸载并不会删除配置文件和区块文件,这些文件需要自己手动删除。

    • sudo make uninstall DESTDIR=/home/alice/bitcoin

以上是关于Windows10 和 Ubuntu 编译Bitcoin的主要内容,如果未能解决你的问题,请参考以下文章

[WSL]Windows10 Ubuntu子系统编译安装线程安全版LAMP

在 Ubuntu 9.10 上使用 Qt 编译共享库

windows和ubuntu虚拟机设置共享文件夹,在windows中用source insight阅读和编写代码,在linux中用交叉编译工具编译。

微软在 Windows 10 上支持 Ubuntu 容器

win10编译ffmpeg

如何将 Windows 中的 CodeBlocks MingW 编译到 Ubuntu 或 Centos