1. Windows 10 下使用Visual Studio 2019编译Bitcoin
目前Bitcon 官网上推荐用VS2017或者VS2019进行编译,本文用VS2019进行编译,这里是官方编译文档
-
从github官网下载bitcoin源代码。
- git clone https://github.com/bitcoin/bitcoin.git
-
我编译的是比特币0.19版本,在进行编译前,先切换到0.19版本,你也可以选择自己编译其他版本。
- cd bitcoin
- git checkout 0.19
-
下载vcpkg,用于安装和管理bitcoin依赖的第三方包, vcpkg 可以下载到任何位置。
- git clone https://docs.microsoft.com/en-us/cpp/vcpkg
-
将vcpkg加入系统环境变量的path中,即将vcpkg.exe所在父目录加入到系统变量的Path中,例如我的vcpkg直接在c盘,那么Path中添加"C:\vcpkg"。
-
使用vcpkg下载Bitcoin需要的第三方包, 在vcpkg.exe所在的目录输入如下指令。 需要说明的是,这个指令和Bitcoin Github官网上的编译命令有所不同,区别是对于libevent[thread]的安装,我安装过程中系统报错:Error:
thread
is not a feature of packagelibevent
,于是我索性改为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
-
将vcpkg所有下载安装的包集成至Visual Studio中,集成指令如下。 通过上述配置,在VS项目中便可以直接#include三方库目录/头文件,库的引用和链接会自动完成,不用手工指定依赖的lib和头文件。
- vcpkg integrate install
-
以管理员身份打开powershell(windows terminal 也可以),进入bitcoin源文件目录下,输入如下指令。v142表示VS2019, 默认为v141 即VS2017。这里不得不吐槽一下,官方这个教程做的真是差,我仔细看了这个msvc-autogen.py脚本才知道还可以指定脚本,而且运行msvc-autogen.py的python语法是错的。
- python build_msvc\msvc-autogen.py -toolset=v142
-
在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
-
按照正常流程,应该不会出现问题,但是实际上,我在第8个步骤就遇到了很多个错误,不过这些错误都是一类,显示如下:
- error MSB4019: 未找到导入的项目“C:\Microsoft.Cpp.Default.props”。请确认 <Import>声明中的路径正确,且磁盘上存在 该文件.
-
通过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)
-
实际上,我把上述三个方法都给试了一次,然后继续执行第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
-
然后继续运行第8个步骤的指令,基本上就通过了。这时候可以在VS2019中打开bitcon.sln文件,然后可以调试了。因为我没有安装qt需要的一些安装包,而且调试bitcoin也不需要界面,我们首先打开VS 2019,在解决方案浏览器(英文Solution Explorer)中,如下图所示。
-
选择bitcoind,鼠标右键单击,选择将bitcoind设置为启动项,然后打开bitcoind中的bitcoin.cpp文件,给main函数加断点,然后按F5即可进入调试。
-
**PS:**我并不需要界面调试,因此qt这方面的依赖库我没有安装。
2. Ubuntu 下编译Bitcoin
Ubuntu下编译Bitcoin的官方参考文档
-
从github官网下载bitcoin源代码。
- git clone https://github.com/bitcoin/bitcoin.git
-
安装必要的依赖包,下面命令将整个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
-
进入bitcoin文件,切换到0.19版本,然后运行autogen.sh文件:
-
git checkout 0.19
-
sudo sh ./autogen.sh
-
-
进行整个系统的配置。如果只是运行系统,不是真正使用bitcon的钱包系统,在configure中配置不使用钱包:
- ./configure --disable-wallet
-
使用make指令进行编译, -j4表示4核并行编译,如果你的机器是2核,那就是-j2,另外也可以直接sudo make进行编译,只是慢一点而已。
- sudo make -j4
-
在第5步骤中可能会出现下面错误:
bin/bash: … /share/genbuild.sh:Permission denied
解决办法是修改bitcon中share文件的权限:
-
cd /bitcoin/share
-
chmod 777 genbuild.sh
-
-
在第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作用是生成动态链接库
-
编译成功后,使用make install指令进行安装,下面指令制定安装到/home/alice/bitcoin路径下,读者可以指定自己的安装位置。
- sudo make install DESTDIR=/home/alice/bitcoin
-
安装成功后,可执行文件在/home/alice/bitcoin/usr/local/bin文件下,生成如下文件.
- bench_bitcoin bitcoin-cli bitcoind bitcoin-qt bitcoin-tx test_bitcoin test_bitcoin-qt
-
其中bitcoind是全节点命令行程序,在命令行中输入./bitcoind 即可以默认的方式进行启动。不过我不建议你这么使用,在启动之前最好配置一个bitcoin.conf文件,这个文件里面可以配置很多内容,例如区块文件的存储位置、是否转发交易、交易池大小等等。配置文件的使用和配置方法具体信息参考这里。
- ./bitcoind 默认启动方案
- ./bitcoind -conf=/home/alice/bitcoin/bitcoin.conf 指定配置文件的启动方式
-
命令行bitcoind程序如何退出?在bin文件下,通过bitcoin-cli结束运行。下述命令告知系统结束运行。如果强行结束会破坏系统中区块文件存储,因此建议按照这个命令退出程序。bitcoin-cli是一个命令行工具,在bitcoind程序运行的时候,可以通过该命令行工具获得系统运行的一些信息,例如连接的节点数、交易池大小等等。
- ./bitcoin-cli stop
-
卸载bitcoin,需要先退出系统,然后使用make uninstall指令卸载。整个卸载并不会删除配置文件和区块文件,这些文件需要自己手动删除。
- sudo make uninstall DESTDIR=/home/alice/bitcoin