1. 程式人生 > >在windows 10上編譯bitcoin原始碼

在windows 10上編譯bitcoin原始碼

轉載自: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