转载自:https://zhuanlan.zhihu.com/p/25021080

编译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

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

  • build-essential 是一个基础的编译工具链的集合包,包括基础的gcc/g++,make等等 参考这个链接

  • libtool 是在不同系统中建立动态链接库时提供的上层统一接口,参考 这里 和 这里 还有就是这里也解释的很通俗。可以看出这个工具将会提供在不同的平台下编译时上层的统一抽象接口,可以预知在make的时候会有相关的参数开关

  • autotools-dev 是linux下制作供编译,安装和打包软件的配置脚本的工具 参考这里,换句话说就是生成makefile和一些配置文件的工具

  • automake和上面同样

  • pkg-config 这个是包信息管理的工具 参考这里

  • bsdmainutils 看名字就知道是BSD的主要工具包(其实应该肯定自带了··)

  • 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 平台下进行编译。

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

  • 如果是checking 没找到那么就是在第一条的时候有编译工具链缺失。

  • 如果是下载失败就去检查网络环境,挂vpn或代理什么的重来一遍

在一边工具根据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

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

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

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

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

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

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

 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:\workspace\bitcoin这个目录对应于bash就应该为:

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

六、结尾

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

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

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

编辑于 2017-01-26

在windows 10上编译bitcoin源码相关推荐

  1. 在Windows和Linux上编译gRPC源码操作步骤(C++)

    gRPC最新发布版本为v1.23.0,下面以此版本为例说明在Windows和Linux下编译过程. Windows7/10 vs2103编译gRPC源码操作步骤: 1. 需要本机已安装Git.CMak ...

  2. 海思3559A上编译Valgrind源码操作步骤

    注:按照以下步骤可以在海思板子上正常编译valgrind源码并生成valgrind可执行文件,但可能还不能在海思板子上正常使用. 1. 从http://valgrind.org/downloads/? ...

  3. 在Windows上编译Spark源码

    原文转自http://my.oschina.net/u/1452001/blog/344067?fromerr=1iS9kYnS 在本机(Windows 8)上安装spark玩一玩,Spark的Qui ...

  4. linux3.10.46源码下载,Ubuntu11.10下编译android源码4.0.3

    1.初始化编译环境 软件需求: Python2.5-2.7,可以http://www.python.org/download/下载(Ubuntu11.10自带). JDK6:编译Gingerbread ...

  5. Windows上编译github源码方式运行Node-RED,以及离线迁移安装Node-RED

    场景 Node-RED简介与Windows上安装.启动和运行示例: Node-RED简介与Windows上安装.启动和运行示例_BADAO_LIUMANG_QIZHI的博客-CSDN博客 上面是在Wi ...

  6. 海思3559A上编译LIVE555源码操作步骤

    1. 从http://www.live555.com/liveMedia/public/ 下载live.2019.06.28.tar.gz,并解压缩: 2. 生成静态库,拷贝一份config.arml ...

  7. Windows10上编译MXNet源码操作步骤(Python)

    1. 按照https://blog.csdn.net/fengbingchun/article/details/84997490  中操作步骤首先在Windows上通过VS2017编译MXNet源代码 ...

  8. 海思3559A上编译GDB源码操作步骤及简单使用

    1. 从http://ftp.gnu.org/gnu/gdb/ 下载最新稳定版8.3,即gdb-8.3.tar.gz,解压缩: 2. 在gdb-8.3目录下,创建一个build.sh脚本文件,内容如下 ...

  9. 海思3559A上编译FFmpeg源码操作步骤

    1. 从https://github.com/FFmpeg/FFmpeg/releases 下载你需要的版本: 2. 因为ffmpeg编译选项较多,为了更方便的了解有哪些选项,可将编译选项写入到一个文 ...

  10. 在Ubuntu14.04 64位上编译CMake源码操作步骤

    在Ubuntu上通过apt-get install安装CMake并不是最新版的,这里记录下在Ubuntu上通过源码安装CMake的操作步骤: 1.        卸载旧版CMake,执行以下命令: a ...

最新文章

  1. java 快排_八大排序-快速排序(搞定面试之手写快排)
  2. 介绍一个懒人创建springmvc项目的方法(二)
  3. 资源丨机器学习进阶路上不可错过的28个视频
  4. vfp如何比较两张表的关键字重复_Access开发中建表的基本原理和规范(上)
  5. POJ - 2175 Evacuation Plan(最小费用最大流+消圈定理)
  6. 关于“进程”与“线程”的最通俗解析
  7. Web和HTTP基本术语和概念
  8. cdn需要备案吗_车子贴改色膜需要到车管所备案吗?
  9. java线程间的协调
  10. linux-安装树形查看工具-tree
  11. 【LeetCode】11. Container With Most Water 解题小结
  12. Python进阶:并发编程之Asyncio
  13. 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
  14. 初识Git 如何使用Git将本地项目上传到Github
  15. python爬取genek视频_【Python】爬虫(Xpath):批量爬取站长免费简历
  16. 完全激活win server 2012 R2 的方法(亲测可行!)
  17. Flash加速功能实现
  18. java ews_Java---使用EWS读取exchange邮件
  19. 华为手机怎么使用读卡器_华为手机怎么绑定门禁卡
  20. Promise.resolve几种情况

热门文章

  1. CURL命令测试网站打开速度
  2. win10提高开机速度只需要5步
  3. 我在豆瓣“请假借口研究所”,看见了社畜的人间真实
  4. 身份证验证判断、身份证正则表达式、15位、18位身份证验证
  5. 路畅安卓最新固件升级_【精】2017.11.10日更新 路畅软件升级,最新版4.0.9 更新【郑重声明】...
  6. java贪吃蛇保存,Java 实现贪吃蛇游戏的示例
  7. HTTP Basic Auth:使用和Postman 测试
  8. Windows Server 2016 搭建DHCP服务器(踩坑后总结)
  9. Go 语言开发工具 LiteIDE x22 发布
  10. IT精英?OR IT民工?