在windows 10上编译bitcoin源码


编译bitcoin的平台:

windows 10 64bit ver.1607(14393.693)

bitcoin ver.0.13.2

如果windows 不是 win 10 64bit ,或者编译的bitcoin版本是0.9左右的同学,请移步:

【比特币】自己动手编译比特币客户端

如何在windows平台下编译比特币bitcoin客户端

============================愚蠢的分割线=============================

本来以为在windows上编译bitcoin会是一件相当麻烦的事情·· 结果简单浏览了下bitcoin官方文档:

WINDOWS BUILD NOTES

发现这在win10下是一件很简单的事情呀···

在没看之前还以为要配置好qt的windows环境,以及一系列依赖包什么的,结果发现按照文档的描述就是简单的在linux环境下进行交叉编译,最后的可执行文件联合MinGW编译成为win平台下的应用。

以至于如果你本来就是个比较合格的程序员就不用看啦,直接看文档就好了。我这篇教程还是写给低年级的学弟学妹看,(划掉)用来传教吧(滑稽)(划掉)

然后win10已经相当棒的提供了Bash On Ubuntu On Windows,那么简直就没有什么障碍了。如果作为一个使用windows的程序员还没有在你的电脑上开启这个Bash,那么我只能说微软爸爸提供给你这么好的东西你居然不用简直就是暴殄天物(摊手),下面是安装链接

安装 windows bash

连百度经验都有了好么(摔) 如何在Windows 10安装和使用Linux的Bash shell

好吧,那么在准备好bash环境后,就可以按照官方文档进行安装了(第一条链接)

一、首先在bash环境中安装好基础的编译工具链

打开cmd或者powershell, 输入bash进入bash环境,然后复制粘贴

sudo apt-get install build-essential libtool autotools-dev automake  pkg-config bsdmainutils curl

一个一个解释下分别安装了什么

二、下载bitcoin的源码

在安装了以上基础工具后,就可以把源码从github上下载下来了。

bitcoin github 源码 (加粗以示尊敬#滑稽)

因为我们打算研究源码,所以就使用git的方式clone下来,而不是只看最新的源码而下载zip。所以保证不管是在windows上还是在 windows的bash上,已经安装git。

然后切换到一个工作目录下,比如叫做sourcecode或者什么的吧··,复制粘贴

git clone https://github.com/bitcoin/bitcoin.git

这样的话,到时候查看源码的时候就方便checkout到某次tag或commit下的源码

三、安装MinGW相关的包

在bash环境中,按照教程,首先在64位的电脑上安装的是

sudo apt-get install g++-mingw-w64-x86-64 mingw-w64-x86-64-dev

ps:在64位的电脑中可以交叉编译32位的bitcoin,需要的命令不同,详见官方文档。

四、开始编译

在下载源码的时候我们的目录比如是/sourcecode 文件夹,那么此时在bash的环境下,执行ls

xxxxx/sourcecode$ dirbitcoin

应该会列出当前目录下有bitcoin这个文件夹,那么我们

xxxxx/sourcecode$ cd bitcoin/
xxxxx/sourcecode/bitcoin$ lsautogen.sh  configure.ac  CONTRIBUTING.md 
 depends  INSTALL.md                 Makefile.am  README.md  
srcbuild-aux   contrib       COPYING          doc      libbitcoinconsensus.pc.in  qa           share

应该可以看到下面这些文件及文件夹,此刻我们 cd 进入 depends/ 文件夹

加粗!!!

注意,在执行下面make HOST=x86_64-w64-mingw32请在网络环境好的情况下进行,特别是可以的话挂上合适的代理或者vpn,要持续很久,下载很多依赖包,不要把时间浪费在下载上,编译要持续很久的 (╯‵□′)╯︵┻━┻

xxxxx/sourcecode/bitcoin$ cd depends/
xxxxx/sourcecode/bitcoin/depends$ make -j HOST=x86_64-w64-mingw32Fetching ...
...   

这里我们看到执行了 make 命令开始生成和配置makefile文件,这里我们看到传入的开关参数是HOST=x86_64-w64-mingw32表明我们是在 windows 64bit 平台下进行编译。

这里我们可以看到首先先下载了一些东西,然后开始检查已有的软件包是否完整,如果中途中断了,那么:

在一边工具根据makefile生成的过程中,我们可以打开makefile文件简单的看一下Host开关让makefile干了些什么事情

简单的查阅下,可以试着取到一些变量的值

$host is [x86_64-w64-mingw32]
$host_os is [mingw32]
$host_arch is [x86_64]$host_prefix is [x86_64]
$build_prefix is [/mnt/c/Users/Administrator/Desktop/tmp/x86_64-w64-mingw32/native] #这条是我本地的测试位置
$build_host is [x86_64-pc-linux-gnu]
$packages is [boost openssl libevent zeromq   qrencode protobuf qt  bdb miniupnpc]
$native_packages is [native_ccache   native_protobuf]
$all_packages is [boost openssl libevent zeromq   qrencode protobuf qt  bdb miniupnpc native_ccache   native_protobuf]
$NO_QT is []
$build_os is [linux]

可以观察到在使用了host开关后,可以得到这些关键信息:

$host = [x86_64-w64-mingw32]
$host_arch = [x86_64]
$all_packages = [boost openssl libevent zeromq qrencode protobuf qt  bdb miniupnpc native_ccache  native_protobuf]
$build_os = [linux] # 这就是交叉编译的体现

特别是all_packages 可以帮助我们预先就判断好折后可能会引入哪些包,之后在遇到不认识的东西的时候就更快的具有定向的属性,免得没有头绪

ps: 我就是缺少了好多包··· 然后就是在慢慢的下,如果可以的话一开始就挂代理或者vpn的话会节省很多时间,哎···

这里的makefile文件并不是很复杂,有心的同学可以慢慢揣摩下,大致的思路就是先确定各个平台参数变量,然后根据平台参数引入相应的mk文件,然后检查依赖包,然后下载源码,编译····

pps: 在bash中编译一段时间似乎会出现 Cannot allocate memory 这样莫名奇妙的错误·· 似乎是bash的bug,这时候只能退出bash然后再重新进入,然后再在depends/目录下执行

make HOST=x86_64-w64-mingw32

可以接着上次的末尾继续执行

===========================怠惰的分割线==============================

在经过相当相当漫长的等待后····直到出现了:

在windows 10上编译bitcoin源码

这个画面的时候,此时依赖库就已经全部下载编译好了。。对,你没看错,此时只是编译好了依赖库,接着你才能开始进行bitcoin源码的编译。

此时如果好奇的话,我们重新比较下/sourcecode/bitcoin/depends/这个文件夹下的内容发生了什么变化:

在windows 10上编译bitcoin源码

在windows 10上编译bitcoin源码

前一张图是编译后,后一张图是编译前,我们可以发现多出了:

 built/
sources/work/x86_64-w64-mingw32/

这4个文件夹,其中work/目录是刚才make过程中的暂存空间,make结束后里面应该都是一些空文件夹,而built/和source/都是那些依赖库的源码,区别在于后者是下载下来的,前者是make运行过程中的。

而x86_64-w64-mingw32/文件夹就是make的产物了。

接着首先执行cd ..回到上一个bitcoin的根目录下:

 xxxx/sourcecode/bitcoin/depends$ cd ..
xxxx/sourcecode/bitcoin$ ./autogen.sh 
xxxx/sourcecode/bitcoin$ CONFIG_SITE=$PWD/depends/x86_64-w64-mingw32/share/config.site ./configure --prefix=/ CXXFLAGS="--param ggc-min-expand=1 --param ggc-min-heapsize=32768" 
xxxx/sourcecode/bitcoin$ make -j

这样就执行好正常的 configure | make流程了

ps: 请注意:截至目前(2017/1/26日为止),官网给出的depends脚本下载的qt是编译不了qwindows插件的,因为官网脚本索取的源变为了qt5.7.1而原本编译的qt版本为5.6,所以此时编译出的bitcoin是不带gui的,也就是无法编译bitcoin-qt.exe这个文件。(自己改肯定是可以的,方法就是从官方脚本中剔除qt的下载与编译,然后在自己的环境中装好5.6版本的qt,但是就要花很多精力了) 根据 这个issue有详细描述 里面说明该问题将会在 0.14 版本解决

对于目前来说执行 configure 的过程中就会出现如下的信息:

checking for static Qt plugins: -lqwindows… no

configure: WARNING: Could not resolve: -lqwindows; bitcoin-qt frontend will not be built

并且在最后出现

Options used to compile and link: with wallet = yes

with gui / qt = no

with zmq= yes

with test= yes

with bench = yes

with upnp= yes

debug enabled = no

with gui / qt = no的设置。所以之后的make是不会出现gui的。

pps: CXXFLAGS=”–param ggc-min-expand=1 –param ggc-min-heapsize=32768″这个参数按照官网解释是

C++ compilers are memory-hungry. It is recommended to have at least 1.5 GB of memory available when compiling Bitcoin Core. On systems with less, gcc can be tuned to conserve memory with additional CXXFLAGS

而对make添加 -j参数是启用并行编译,可以减少编译时间。

五、安装到合适的位置

在make结束后,就可以使用make install来开始把编译好的程序拷贝到合适的目录下了。因为使用的是windows bash

所以要注意在windows上的路径对应于bash路径的填写方式。如c:workspacebitcoin这个目录对应于bash就应该为:

make install DESTDIR=/mnt/c/workspace/bitcoin

六、结尾

至此对于bitcoin在window10上的编译安装就结束了。当然这是完全没什么鸟用的,整个流程下来你只不过是了解了编译一个bitcoin源码会经过哪些流程。如果你更改了源码只能通过相同的方式在这种交叉编译的条件下重新编译,并不能在vs下随便下断点查看运行流程,所以你可能是看了假教程(逃

我想做到的是通过替换一些库和更改一些代码同时改变编译流程,能够在windows平台上用 vs 来编译出bitcoin的源码(当然这个编译出来的东西就只能当作研究用了源码,不可能接入bitcoin网络的。),这样就可以在windows平台上编译且最重要的就是能够利用vs来实时调试,毕竟珍爱生命,远离gdb“`,能用有效的工具进行研究才是更有效率的事情

但是要做到这个就要花费相当大的精力了,不是一时半会能完成的。这就当挖了一个坑吧,等我弄出来的时候就发出来。


© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 共1条

请登录后发表评论