比特幣0.9.2中文版編譯手冊
比特幣0.9.2中文版編譯手冊
日期:2014-07-01
構建比特幣原始碼,是一件十分費時費力的工作,尤其在windows系統中編譯比特幣原始碼更加的麻煩,經過一兩天努力,終於在windows7 64位系統中成功編譯出了比特幣原始檔。現在總結如下,首先準備一套乾淨的windows7 64位作業系統,最好是使用vbox或者vmware虛擬機器建立一個專用系統,這樣的可以防止其它干擾導至編譯失敗,接下來說說,我的編譯過程:
1.安裝msys系統
msys作用是在windows系統中重建linux系統編譯環境,在msys系統下操作,就像linux中的操作一樣,具有相同的語法命令。從下面的網址中下載msys
然後執行mingw-get-setup.exe檔案後,選擇安裝目錄為H:\MinGW,之後軟體會首先更新下載庫,更新成功會彈出一個視窗MinGW installation manager,在這個視窗中,只下載msys相關的包檔案,不要下載mingw相關檔案,因為不使用它帶的這個mingw。
主要如下面所示:
msys-base-bin
msys-autoconf-bin
msys-automake-bin
msys-libtool-bin
選擇好之後,點選Installation->Apply changes即可。一定要確保mingw包沒有被下載,這裡我們只需要msys
2.安裝perl系統
由於在編譯比特幣時,需要呼叫一些perl指令碼,所以從下面的網址中下載一個perl安裝程式,然後安裝即可。
3.安裝python
同樣還需要用到python環境,這裡下載最新版的pytnon3.4.0版,並安裝它。在安裝時,注意選擇add python to path.
4.安裝MinGW
下載安裝最新版的mingw 4.9.0版本,i686-4.9.0-release-posix-dwarf-rt_v3-rev2.7z
將這個mingw包中檔案全部解壓到H盤的mingw32目錄內,你可根據自己的需要解壓到合適位置。安裝後應該如下圖所示:
5.設定環境變數
在桌面上,滑鼠右鍵計算機圖示,在彈出選單中選擇屬性,在彈出視窗中,在左側邊欄中,選擇高階系統設定,接著選擇高階選項卡中的環境變數按鈕,在彈出視窗中,將系統變數中的path,新增H:\mingw32\bin,而perl和python安裝後,會自動進行設定變數,如果沒有,也應新增進來,如下面所示:
H:\MinGW32\bin;C:\Python34\;C:\Python34\Scripts;D:\Perl64\site\bin;D:\Perl64\bin;
6.檢測編譯環境是否正確
首先檢查H:\MinGW\bin目錄中,確保目錄中只有一個mingw-get.exe檔案。然後執行控制檯cmd,在命令列中輸入gcc -v,將會看到如下面所示,則環境正確:
7.下載並編譯相關檔案包
本文中,將用到所有相關檔案包,都下載到了H:\deps目錄中了,所以在接下來的編譯過程中,將圍繞這個目錄。
啟動msys(h:\MinGW\msys\1.0\msys.bat),然後使用下面的命令解壓並編譯OpenSSL檔案。
cd /h/deps/ tar xvfz openssl-1.0.1h.tar.gz cd openssl-1.0.1h Configure no-shared no-dso mingw make |
可以上將面的檔案包存為openssl.sh檔案,然後msys中直接執行這個檔案即可。在這裡要注意的是,也不知道什麼原因,有時候使用這種指令碼方式執行時,會發現命令處理到一半時,就提前退出了,我在我電腦中發現,經常不會執行最後make命令,如果你發現指令碼沒有make時,可以直接繼續輸入make即可。
編譯完成後,將會如下圖所法介面所示:
在這裡,最好是下載db-4.8.30.NC.tar.gz版本,其它版本不一定能用,依然是從msys中進行編譯DB資料庫,命令如下所示:
cd /h/deps/ tar xvfz db-4.8.30.NC.tar.gz cd db-4.8.30.NC/build_unix ../dist/configure --enable-mingw --enable-cxx --disable-shared --disable-replication make |
這裡使用最新版的boost 1.55.0,下載之後,將檔案解壓到H:\deps\boost_1_55_0內。然後啟動windows命令控制檯cmd,然後使用下面的命令進行編譯,請注意下面的b2命令是一行命令(不要在msys中執行下面的命令,否則不能成功,boost編譯時間較長):
cd h:\deps\boost_1_55_0\ bootstrap.bat mingw b2 --build-type=complete --with-chrono --with-filesystem --with-program_options --with-system --with-thread toolset=gcc variant=release link=static threading=multi runtime-link=static stage |
b2命令中設定,會將boost的編譯結果複製到h:\deps\boost_1_55_0\stage內。
先在msys系統中,使用tar命令解壓miniupnpc-1.9.tar.gz,命令如下:
cd /h/deps/ tar xvfz miniupnpc-1.9.tar.gz |
將解壓出來的miniupnpc-1.9資料夾,重新命名為minupnpc,接著在windows命令控制檯cmd中,編譯miniupnpc,命令如下所示:
cd h:\deps\miniupnpc mingw32-make -f Makefile.mingw init upnpc-static |
然後使用winrar或者7zip將它解壓,然後接著在msys中執行下面的命令,編譯它們:
cd /h/deps/protobuf-2.5.0 configure --disable-shared make |
依然是在msys中編譯ligpng,命令如下所示:
cd /c/deps/libpng-1.6.12 cp .libs/libpng16.a .libs/libpng.a |
在編譯qrencode時會用到libpng庫,所以編譯命令如下所示:
tar xvfz qrencode-3.4.3.tar.gz cd /h/deps/qrencode-3.4.3 |
7.8 Qt 5.3.0編譯
這裡要注意的是,由於比特幣原始碼要求必須使用SSL和Zlib支援,所以只能下載QT原始碼,重新編譯QT。下載地址如下所示:
將QT基礎包解壓到h:\Qt\5.3.1目錄中,將QT工具包解壓到h:\Qt\qttools-opensource-src-5.3.1。然後在windows控制檯CMD中執行下面命令:
set INCLUDE=c:\deps\libpng-1.6.10;h:\deps\openssl-1.0.1g\include set LIB=c:\deps\libpng-1.6.10\.libs;h:\deps\openssl-1.0.1g cd c:\Qt\5.2.1 configure.bat -release -opensource -confirm-license -static -make libs -no-sql-sqlite -no-opengl -system-zlib -qt-pcre -no-icu -no-gif -system-libpng -no-libjpeg -no-freetype -no-angle -no-vcproj -openssl-linked -no-dbus -no-audio-backend -no-wmf-backend -no-qml-debug mingw32-make set PATH=%PATH%;c:\Qt\5.2.1\bin cd c:\Qt\qttools-opensource-src-5.2.1 qmake qttools.pro mingw32-make |
在這裡,我將上面的命令儲存為了一個批處理檔案,但是當我執行這個批處理時,發現並沒有時執行最後的mingw32-make任務,只是進行了configure操作後就停止了,所以如果在你電腦上也是這種情況的話,可以分別進入H:\Qt\5.2.1和H:\Qt\qttools-opensource-src-5.2.1目錄內,重新執行mingw32-make命令各一次。
8.編譯比特幣原始碼:
將原始碼包解壓到H:\bitcoin-0.9.2目錄內,然後在msys中執行下面的命令表:
cp /h/deps/libpng-1.6.10/.libs/libpng16.a /h/deps/libpng-1.6.10/.libs/libpng.a cd /h/bitcoin-0.9.1 ./autogen.sh CPPFLAGS="-I/h/deps/boost_1_55_0 \ -I/h/deps/db-4.8.30.NC/build_unix \ -I/h/deps/openssl-1.0.1g/include \ -I/h/deps \ -I/h/deps/protobuf-2.5.0/src \ -I/h/deps/libpng-1.6.10 \ -I/h/deps/qrencode-3.4.3" \ LDFLAGS="-L/h/deps/boost_1_55_0/stage/lib \ -L/h/deps/db-4.8.30.NC/build_unix \ -L/h/deps/openssl-1.0.1g \ -L/h/deps/miniupnpc \ -L/h/deps/protobuf-2.5.0/src/.libs \ -L/h/deps/libpng-1.6.10/.libs \ -L/h/deps/qrencode-3.4.3/.libs" \ ./configure \ --disable-upnp-default \ --disable-tests \ --with-qt-incdir=/h/Qt/5.2.1/include \ --with-qt-libdir=/h/Qt/5.2.1/lib \ --with-qt-bindir=/h/Qt/5.2.1/bin \ --with-qt-plugindir=/h/Qt/5.2.1/plugins \ --with-boost-system=mgw48-mt-s-1_55 \ --with-boost-filesystem=mgw48-mt-s-1_55 \ --with-boost-program-options=mgw48-mt-s-1_55 \ --with-boost-thread=mgw48-mt-s-1_55 \ --with-boost-chrono=mgw48-mt-s-1_55 \ --with-protoc-bindir=/h/deps/protobuf-2.5.0/src make strip src/bitcoin-cli.exe strip src/bitcoind.exe strip src/qt/bitcoin-qt.exe |
在編譯比特幣原始碼時,中途會提示是否刪除一些中件檔案,可以使用下面的補丁指令碼,可以讓編譯器自動跳過這些提問:
--- Makefile.include Sun Mar 16 12:05:28 2014 +++ Makefile.include Wed Mar 26 03:05:58 2014 @@ -40,18 +40,18 @@ ui_%.h: %.ui @test -d $(abs_builddir)/$(@D) || $(MKDIR_P) $(abs_builddir)/$(@D) @test -f $(UIC) && QT_SELECT=$(QT_SELECT) $(UIC) -o $(abs_builddir)/[email protected] $(abs_srcdir)/$< || echo error: could not build $(abs_builddir)/[email protected] - $(SED) -i.bak -e '/^\*\*.*Created:/d' $(abs_builddir)/[email protected] && rm $(abs_builddir)/[email protected] - $(SED) -i.bak -e '/^\*\*.*by:/d' $(abs_builddir)/[email protected] && rm $(abs_builddir)/[email protected] + $(SED) -i.bak -e '/^\*\*.*Created:/d' $(abs_builddir)/[email protected] && rm -f $(abs_builddir)/[email protected] + $(SED) -i.bak -e '/^\*\*.*by:/d' $(abs_builddir)/[email protected] && rm -f $(abs_builddir)/[email protected] %.moc: %.cpp QT_SELECT=$(QT_SELECT) $(MOC) $(QT_INCLUDES) $(MOC_DEFS) -o [email protected] $< - $(SED) -i.bak -e '/^\*\*.*Created:/d' [email protected] && rm [email protected] - $(SED) -i.bak -e '/^\*\*.*by:/d' [email protected] && rm [email protected] + $(SED) -i.bak -e '/^\*\*.*Created:/d' [email protected] && rm -f [email protected] + $(SED) -i.bak -e '/^\*\*.*by:/d' [email protected] && rm -f [email protected] moc_%.cpp: %.h QT_SELECT=$(QT_SELECT) $(MOC) $(QT_INCLUDES) $(MOC_DEFS) -o [email protected] $< - $(SED) -i.bak -e '/^\*\*.*Created:/d' [email protected] && rm [email protected] - $(SED) -i.bak -e '/^\*\*.*by:/d' [email protected] && rm [email protected] + $(SED) -i.bak -e '/^\*\*.*Created:/d' [email protected] && rm -f [email protected] + $(SED) -i.bak -e '/^\*\*.*by:/d' [email protected] && rm -f [email protected] %.qm: %.ts @test -d $(abs_builddir)/$(@D) || $(MKDIR_P) $(abs_builddir)/$(@D) --- qt/Makefile.am Sun Mar 16 12:05:28 2014 +++ qt/Makefile.am Wed Mar 26 03:06:21 2014 @@ -371,7 +371,7 @@ $(QT_QRC_CPP): $(QT_QRC) $(QT_QM) $(QT_FORMS_H) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) $(PROTOBUF_H) @cd $(abs_srcdir); test -f $(RCC) && QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin -o $(abs_builddir)/[email protected] $< || \ echo error: could not build [email protected] - $(SED) -i.bak -e '/^\*\*.*Created:/d' [email protected] && rm [email protected] - $(SED) -i.bak -e '/^\*\*.*by:/d' [email protected] && rm [email protected] + $(SED) -i.bak -e '/^\*\*.*Created:/d' [email protected] && rm -f [email protected] + $(SED) -i.bak -e '/^\*\*.*by:/d' [email protected] && rm -f [email protected] CLEANFILES = $(BUILT_SOURCES) $(QT_QM) $(QT_FORMS_H) *.gcda *.gcno |